salat库映射mongodb数据到CaseClass
添加库依赖
在 sbt.build 文件中添加以下依赖配置:
resolvers ++= Seq(
"repo.novus rels" at "http://repo.novus.com/releases/",
"Sonatype OSS" at "https://oss.sonatype.org/content/repositories/releases"
)
libraryDependencies ++= Seq(
"org.mongodb" %% "casbah" % "2.7.0",
"com.novus" %% "salat" % "1.9.7"
)数据插入(Insert)
import com.mongodb.casbah.Imports._
import com.novus.salat._
import com.novus.salat.global._
case class User(uid: String, provider: String, age: Int)
object Sample extends App {
// 获取 test_collection 集合
val col = DB.get().getCollection("test_collection")
// 创建 User 对象并转换为 MongoDB Document
val userObj = grater[User].asDBObject(User("Azalea", "Facebook", 30))
// 插入操作
val result = col.insert(userObj)
println(result)
}数据查询(Find)
val result = col.find()
import scala.collection.JavaConversions._
result.iterator().foreach(dbo => {
println(grater[User].asObject(dbo))
})空值处理实践
问题描述
当使用 null 值插入时会发生什么?
val col = DB.get().getCollection("test_collection")
val userObj = grater[User].asDBObject(User("Azalea", null, 30))
val tgt = MongoDBObject("uid" -> "Azalea")
println(col.update(tgt, userObj))
val result = col.findOne(tgt)
println(s"Result : $result")
println(grater[User].asObject(result))执行结果(错误):
{ "serverUsed" : "/127.0.0.1:27017" , "updatedExisting" : true , "n" : 1 , ... }
Result : { "_id" : { "$oid" : "529319fa0cf2b37a655f3a07"} , "uid" : "Azalea" , "age" : 30}
[error] (run-main) java.lang.Exception: class models.connections.User requires value for 'provider'解决方案与最佳实践
将字段类型改为 Option[String]:
case class User(uid: String, provider: Option[String], age: Int)修改插入操作:
val col = DB.get().getCollection("test_collection")
val userObj = grater[User].asDBObject(User("Azalea", None, 30))
val tgt = MongoDBObject("uid" -> "Azalea")
println(col.update(tgt, userObj))
val result = col.findOne(tgt)
println(grater[User].asObject(result))执行结果(成功):
{ "serverUsed" : "/127.0.0.1:27017" , "updatedExisting" : true , "n" : 1 , ... }
Result : { "_id" : { "$oid" : "529319fa0cf2b37a655f3a07"} , "uid" : "Azalea" , "age" : 30}
User(Azalea,None,30)总结
在 Scala 中应避免直接使用 null,推荐使用 Option 类型配合 Some(value) / None 来表达可空字段,这可以:
- 提升代码安全性
- 提高可读性
- 充分发挥 Scala 类型系统的优点