【问题标题】:remove nested mongo document using Casbah使用 Casbah 删除嵌套的 mongo 文档
【发布时间】:2015-06-08 21:08:10
【问题描述】:

给定以下数据结构:

{
  "_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 发出正确的查询。

【问题讨论】:

    标签: mongodb scala casbah


    【解决方案1】:

    首先,{ "$oid" : "55760212e4b011ee8c72fb1e"}BSON 12 bytes ObjectId type 的 JSON 表示。基本上,与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 shell 的角度来看,这应该等同于:

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

    【讨论】:

    • 第一块代码db(collection).update(query, $pull(query))中的错字应为db(collection).update(query, $pull(updt))
    • @andyczerwonka 我现在已经解决了。感谢您指出它。
    • @andyczerwonka 我已经编辑了我的答案以显示使用 DSL 的替代语法。你能试试它是否有效,因为我现在无法测试它吗?
    猜你喜欢
    • 2020-05-27
    • 2013-11-24
    • 2018-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多