【发布时间】:2014-02-25 15:14:45
【问题描述】:
我想像这样在 MongoDB 中更新 JSON 文档:
{
"_id":{"$oid":"52dfc13ec20900c2093155cf"},
"email": "joe@domain.com",
"name": "joe",
"_version": 2
}
...并希望在每次更新时创建一个这样的 vermongo 文档:
{
"_id { "_id":{"$oid":"52dfc13ec20900c2093155cf"}, "_version": 1},
"email": "joe@domain.com",
"name": "joe",
"_version": 1,
"_timestamp" : "2014-02-02T00:11:45.542"
}
我试过这样的解决方案:
trait MyDao {
...
private val shadowCollection = ReactiveMongoPlugin.db.collection[JSONCollection](
collection.name + ".vermongo"
)
private def toVersioned(deleted: Boolean) = __.json.update(
(__ \ '_id).json.copyFrom((__ \ '_id \ '$oid).json.pickBranch) andThen
(__ \ '_id \ '_version).json.copyFrom((__ \ '_version).json.pick) andThen
// (__ \ '_version).json.put(if (deleted) JsString(s"deleted:$version") else JsNumber(version)) andThen
(__ \ '_timestamp).json.put(Json.toJson(LocalDateTime.now))
)
private def version(doc: JsValue, deleted: Boolean): Future[LastError] = {
shadowCollection.insert(doc.transform(toVersioned(deleted)).get)
}
}
toVersioned方法存在三个问题:
第 1 行:它不会创建多字段 _id
第 2 行:当我尝试将 _version 创建为 _id 的第二个字段时,它崩溃了
第 3 行:(注释掉)如果参数 deleted 是 true,我想通过将 "_version": 1 替换为 "_version": "deleted:1" 来将文档标记为已删除;我不清楚如何处理这里的情况。
【问题讨论】:
标签: json mongodb scala playframework reactivemongo