2015-06-08 4 views
1

Учитывая следующую структуру данных:удалить вложенный документ Монго использования Касбы

{ 
    "_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")}} 

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

ответ

1

Во-первых, { "$oid" : "55760212e4b011ee8c72fb1e"} - это представление JSON от BSON 12 bytes ObjectId type. В принципе, то же самое, что и 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 

С точки зрения оболочки Монго, это должно (так же, как:

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

target = { 
    "sites" : { 
      "siteId" : ObjectId("55760212e4b011ee8c72fb1e") 
    } 
} 
db.test.update(query, {$pull: target}) 
+0

typo в первом блоке кода 'db (collection) .update (query, $ pull (query))' должен читать 'db (collectc) .update (query, $ pull (updt)) ' – andyczerwonka

+0

@andyczerwonka Я исправил это прямо сейчас. Спасибо, что указали на это. –

+0

@andyczerwonka Я отредактировал свой ответ, чтобы показать альтернативный синтаксис с помощью DSL. Не могли бы вы попробовать, если он работает, поскольку я не могу проверить его прямо сейчас? –

Смежные вопросы