mongodb - 处理 BSONDocument 中的可选值

标签 mongodb scala playframework-2.2 reactivemongo

我对应用程序中 BSONDocuments 处理可选值的方式有困难。我从 Typesafe activator (play/reactivemongo/angular) 的“最终”模板开始。我创建了一个案例类,表示要进入 Mongo 的对象,其中一些值是选项:

case class Item(
   id: Option[BSONObjectID],
   manufacturer: String,
   minPrice: Option[Double],
   maxPrice: Option[Double])

我遇到的问题是可选值作为数组写入 Mongo。例如,使用“Acme”作为制造商,88 作为最低价格,无作为最高价格。 Mongo 中的 Printjson 显示这看起来像

{
    _id = BSONObjectID("...")
    manufacturer: "Acme",
    maxPrice: [ ],
    minPrice: [
       88
    ]
}

当从数据库值创建对象时,我无法从 Mongo 读回数组值作为简单的选项值。

Item(
   ....
   bsondoc.getAs[Double]("minPrice"),
   ....
)

getAs() 语句总是返回 None,尽管 bsondoc.get("minPrice") 确实有值 Some(BSONDocument())

我打印了发送到 Mongo 以进行更新的数据,果然,创建修饰符语句的代码将可选值作为数组发送,该数组可以为空,也可以包含一个元素。

val modifier = BSONDocument(
    "$set" -> BSONDocument(
      "manufacturer" -> manufacturer,
      "minPrice" -> minPrice,
      "maxPrice" -> maxPrice
    ))

这个 pretty-print 为

{
  $set: {
    manufacturer: BSONString(Acme),
    maxPrice: [

    ],
    minPrice: [
      0: BSONDouble(88.0)
    ]
  }
}

是否有正确的方法来处理这些可选值?

为了增加神秘感,我将相同的修改器创建代码放在工作表中(在 Eclipse 中),但我得到了不同的结果:

{
   $set: {
      manufacturer = BSONString(Acme),
      minPrice = BSONInteger(88)
   }
}

可选值没有数组。如果它们都不是,则它们不会出现。这对我的应用程序来说效果很好,但有些东西正在改变应用程序内部可选元素的 BSONDocument 处理。有谁知道为什么吗?

最佳答案

为了将来引用,我发现这是因为我有以下隐式导入:

import reactivemongo.bson.Producer.nameValue2Producer

当我删除该导入时,它按预期工作

使用响应式(Reactive) mongo 版本 0.10.5.0.akka23。

关于mongodb - 处理 BSONDocument 中的可选值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23051624/

相关文章:

node.js - Express session 无法设置未定义的属性用户

activerecord - Mongodb,mongoid Rails 3.1.* 事件记录错误

javascript - Mongo解析错误: Invalid connection string

deployment - Play Framework - 如何维护不同环境的配置文件?

hibernate - Play Framework 需要很长时间才能加载 hibernate

MongoDB:find() 查询不选择任何内容

java - 其他JVM语言的IntelliJ IDEA插件开发

scala - 使用 Monix Observable 处理错误的更好方法

scala - 在命令行中使用Scala时如何处理classnotfoundexception?

java - Play framework 2.2.0 不会自动生成 getter/setter