使用 Casbah 删除嵌套的 mongo 文档
remove nested mongo document using Casbah
给定以下数据结构:
{
"_id" : ObjectId("55760212e4b011ee8c72fb1f"),
"firstname" : "joe",
"lastname" : "blow",
"email" : "jb@gmail.com",
"sysadmin" : false,
"siteadmin" : false,
"sites" : [
{
"siteId" : ObjectId("55760212e4b011ee8c72fb1e"),
"notification" : false
}
]
}
我正在尝试使用 ObjectId
作为搜索条件 $pull
嵌套的 sites
对象。以下代码:
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 发出正确的查询。
首先,{ "$oid" : "55760212e4b011ee8c72fb1e"}
是BSON 12 bytes ObjectId type. Basically, the same thing as ObjectId("55760212e4b011ee8c72fb1e")
. See http://docs.mongodb.org/manual/reference/mongodb-extended-json/#oid
的JSON表示
然后,当您匹配数组项时,您需要在查询中使用 $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 shell 的角度来看,这应该是相同的:
query = {
"sites" : {
"$elemMatch" : {
"siteId" : ObjectId("55760212e4b011ee8c72fb1e")
}
}
}
target = {
"sites" : {
"siteId" : ObjectId("55760212e4b011ee8c72fb1e")
}
}
db.test.update(query, {$pull: target})
给定以下数据结构:
{
"_id" : ObjectId("55760212e4b011ee8c72fb1f"),
"firstname" : "joe",
"lastname" : "blow",
"email" : "jb@gmail.com",
"sysadmin" : false,
"siteadmin" : false,
"sites" : [
{
"siteId" : ObjectId("55760212e4b011ee8c72fb1e"),
"notification" : false
}
]
}
我正在尝试使用 ObjectId
作为搜索条件 $pull
嵌套的 sites
对象。以下代码:
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 发出正确的查询。
首先,{ "$oid" : "55760212e4b011ee8c72fb1e"}
是BSON 12 bytes ObjectId type. Basically, the same thing as ObjectId("55760212e4b011ee8c72fb1e")
. See 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 shell 的角度来看,这应该是相同的:
query = {
"sites" : {
"$elemMatch" : {
"siteId" : ObjectId("55760212e4b011ee8c72fb1e")
}
}
}
target = {
"sites" : {
"siteId" : ObjectId("55760212e4b011ee8c72fb1e")
}
}
db.test.update(query, {$pull: target})