Я хочу обновить документ JSON в MongoDB следующим образом:
{
"_id":{"$oid":"52dfc13ec20900c2093155cf"},
"email": "[email protected]",
"name": "joe",
"_version": 2
}
... и хотите создать такой документ vermongo при каждом обновлении:
{
"_id { "_id":{"$oid":"52dfc13ec20900c2093155cf"}, "_version": 1},
"email": "[email protected]",
"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"
; мне не ясно, как справиться с условием здесь.