处理BSONDocument中的可选值

时间:2014-04-14 03:46:46

标签: mongodb scala playframework-2.2 reactivemongo

我在应用程序中BSONDocuments处理可选值的方式有困难。我开始使用"最终"来自Typesafe激活器的模板(play / reactivemongo / angular)。我创建了一个表示要进入Mongo的对象的case类,其中一些值是Options:

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

我遇到的问题是可选值是作为数组写入Mongo的。例如,使用" Acme"作为制造商,88作为minPrice而None作为maxPrice。 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
    ))

这相当打印为

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

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

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

为了增加这个谜团,我将相同的修饰符创建代码放在工作表中(在Eclipse中),我得到了不同的结果:

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

可选值没有数组。如果他们不是,他们就不会出现。这对我的应用程序可以正常工作,但有些东西正在改变应用程序内部可选元素的BSONDocument处理。有谁知道为什么?

1 个答案:

答案 0 :(得分:1)

为了将来的参考,我发现这种情况正在发生,因为我有以下隐式导入:

import reactivemongo.bson.Producer.nameValue2Producer

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

使用reactive mongo version 0.10.5.0.akka23。