添加库依赖

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 来表达可空字段,这可以:

  1. 提升代码安全性
  2. 提高可读性
  3. 充分发挥 Scala 类型系统的优点

标签: scala

添加新评论

😊