将JsNumber插入Mongo

时间:2013-09-18 20:01:47

标签: json mongodb scala playframework casbah

尝试插入包含MongoDBObject

JsNumber
val obj: DBObject = getDbObj // contains a "JsNumber()"
collection.insert(obj)

发生以下错误:

[error] play - Cannot invoke the action, eventually got an error: java.lang.IllegalArgumentException: can't serialize class scala.math.BigDecimal

我尝试用JsNumber替换Int,但我收到同样的错误。

编辑

可以通过此测试代码重现错误。 scalatest(https://gist.github.com/kman007us/6617735

中的完整代码
val collection = MongoConnection()("test")("test")
val obj: JsValue = Json.obj("age" -> JsNumber(100))
val q = MongoDBObject("name" -> obj)
collection.insert(q)

2 个答案:

答案 0 :(得分:2)

Plays JSON实现没有注册处理程序 - 您可以添加处理程序以自动将播放Js类型转换为BSON类型。但是,它不会处理具有处理非本机json类型的特殊结构的mongodb extended json,例如:date和objectid translations。

使用它的一个例子是:

import com.mongodb.util.JSON
val obj: JsValue = Json.obj("age" -> JsNumber(100))
val doc: DBObject = JSON.parse(obj.toString).asInstanceOf[DBObject]

有关bson变换器的示例,请参阅joda time transformer

答案 1 :(得分:1)

似乎casbah驱动程序与Plays的JSON实现不兼容。如果我查看cashbah代码,您似乎必须使用一组MongoDBObject对象来构建查询。以下代码段应该有效。

val collection = MongoConnection()("test")("test")
val obj = MongoDBObject("age" -> 100)
val q = MongoDBObject("name" -> obj)
collection.insert(q)

如果您需要与Play的JSON实施兼容,请使用ReactiveMongoPlay-ReactiveMongo

修改

也许这个Gist有助于将JsValue个对象转换为MongoDBObject个对象。