удалить вложенный документ монго с помощью Casbah

Учитывая следующую структуру данных:

{
  "_id" : ObjectId("55760212e4b011ee8c72fb1f"),
  "firstname" : "joe",
  "lastname" : "blow",
  "email" : "[email protected]",
  "sysadmin" : false,
  "siteadmin" : false,
  "sites" : [ 
    {
      "siteId" : ObjectId("55760212e4b011ee8c72fb1e"),
      "notification" : false
    }
  ]
}

Я пытаюсь $pull вложить sites объект, используя ObjectId в качестве критерия поиска. Следующий код:

val siteSearch = MongoDBObject("siteId" -> siteId)
val query = MongoDBObject("sites" -> siteSearch)
db(collection).update(query, $pull(query))

генерирует для следующих query

{ "sites" : { "siteId" : { "$oid" : "55760212e4b011ee8c72fb1e"}}}

Я предполагаю, что это не удаление сайта, потому что я хочу, чтобы query выглядело так:

{ "sites" : { "siteId" : ObjectId("55760212e4b011ee8c72fb1e")}}

Я не уверен, как заставить Cashbah выдать правильный запрос.


person andyczerwonka    schedule 08.06.2015    source источник


Ответы (1)


Во-первых, { "$oid" : "55760212e4b011ee8c72fb1e"} — это JSON-представление BSON 12-байтового типа ObjectId. По сути, то же самое, что и ObjectId("55760212e4b011ee8c72fb1e"). См. http://docs.mongodb.org/manual/reference/mongodb-extended-json/#oid

Затем, когда вы сопоставляете элемент массива, вам нужно использовать $elemMatch в своем запросе. Но, поскольку $pull применяет свой запрос к каждому элементу, как если бы это был объект верхнего уровня, он не нужен в выражении обновления.

val siteSearch = MongoDBObject("siteId" -> siteId)
val elemMatch = MongoDBObject("$elemMatch" -> siteSearch)

val query = MongoDBObject("sites" -> elemMatch)
val target = MongoDBOjbect("sites" -> siteSearch)

db(collection).update(query, $pull(target))

У меня нет под рукой Casbah, но с помощью Casbah DSL, я думаю, вы можете использовать этот альтернативный синтаксис:

val query = "sites" $elemMatch siteSearch

С точки зрения оболочки Mongo это должно быть так же, как:

query = {
    "sites" : {
        "$elemMatch" : {
            "siteId" : ObjectId("55760212e4b011ee8c72fb1e")
        }
    }
}

target = {
    "sites" : {
            "siteId" : ObjectId("55760212e4b011ee8c72fb1e")
    }
}
db.test.update(query, {$pull: target})
person Sylvain Leroux    schedule 08.06.2015
comment
опечатка в первом блоке кода db(collection).update(query, $pull(query)) следует читать db(collection).update(query, $pull(updt)) - person andyczerwonka; 09.06.2015
comment
@andyczerwonka Я исправил это прямо сейчас. Спасибо, что указали на это. - person Sylvain Leroux; 09.06.2015
comment
@andyczerwonka Я отредактировал свой ответ, чтобы показать альтернативный синтаксис с использованием DSL. Не могли бы вы попробовать, если это работает, поскольку я не могу проверить это прямо сейчас? - person Sylvain Leroux; 09.06.2015