不持久Scala None而不是持久化为null值

时间:2017-01-27 08:28:09

标签: mongodb scala mongo-scala-driver

我注意到scala驱动程序(版本1.2.1)将None的Option值作为null写入相应的字段。在这种情况下,我宁愿完全省略fieid。这可能吗?

示例

case class Test(foo: Option[String])
persist(Test(None))

导致

> db.test.find()
{ "_id": "...", "foo": null }

但我想实现

> db.test.find()
{ "_id": "..." }

当我使用casbah时,我认为我的预期行为是默认行为。

2 个答案:

答案 0 :(得分:2)

http://mongodb.github.io/mongo-scala-driver/2.4/bson/macros/

现在您可以使用宏了:

val testCodec = Macros.createCodecProviderIgnoreNone[Test]()

并在编解码器conf中:

lazy val codecRegistry: CodecRegistry = fromRegistries(fromProviders(testCodec))

答案 1 :(得分:1)

在mongodb bug跟踪器(https://jira.mongodb.org/browse/SCALA-294)中打开了一个功能请求,Ross Lawley回答了这个请求。他建议从

更改转换代码(从案例类到文档)
def toDocument(t: Test) = Document("foo" -> t.foo)

类似

def toDocument(t: Test) = {
  val d = Document()
  t.foo.foreach{ value =>
    d + ("foo" -> value)
  }
  d
}