如何构建查询以更新mongo中的嵌套数组文档?

时间:2012-10-05 09:12:32

标签: java mongodb

我在mongo中有以下文档,

  {
   "_id" : ObjectId("506e9e54a4e8f51423679428"),
   "description" : "ffffffffffffffff", 
   "menus" : [  
                {   
                  "_id" : ObjectId("506e9e5aa4e8f51423679429"),     
                   "description" : "ffffffffffffffffffff",  
                      "items" : [
                               {    
                              "name" : "xcvxc",     
                              "description" : "vxvxcvxc",   
                              "text" : "vxcvxcvx",  
                              "menuKey" : "0",  
                               "onSelect" : "1",    
                              "_id" : ObjectId("506e9f07a4e8f5142367942f") 
                              } ,
                              {     
                              "name" : "abcd",  
                              "description" : "qqq",    
                              "text" : "qqq",   
                              "menuKey" : "0",  
                               "onSelect" : "3",    
                              "_id" : ObjectId("507e9f07a4e8f5142367942f") 
                              }
                             ] 
                 },
                 {  
                    "_id" : ObjectId("506e9e5aa4e8f51423679429"),   
                    "description" : "rrrrr",    
                     "items" : [    {   
                                 "name" : "xcc",    
                                 "description" : "vx",  
                                 "text" : "vxc",    
                                 "menuKey" : "0",   
                                "onSelect" : "2",   
                              "_id" : ObjectId("506e9f07a4e8f5142367942f") 
                         } ]
                } 
            ]
   } 

现在,我想更新以下文档:

 {  
     "name" : "abcd",   
    "description" : "qqq",  
    "text" : "qqq",     
    "menuKey" : "0",    
        "onSelect" : "3",   
    "_id" : ObjectId("507e9f07a4e8f5142367942f") 
  }

我有主要的documnet id:“_ id”:ObjectId(“506e9e54a4e8f51423679428”)菜单ID  “_id”:ObjectId(“506e9e54a4e8f51423679428”)以及项目ID “_ id”:ObjectId(“507e9f07a4e8f5142367942f”),需要更新。

我尝试过使用以下查询:

db.collection.update({ "_id" : { "$oid" : "506e9e54a4e8f51423679428"} , "menus._id" : { "$oid" : "506e9e5aa4e8f51423679429"}},{ "$set" : { "menus.$.items" : { "_id" : { "$oid" : "506e9f07a4e8f5142367942f"}} , "menus.$.items.$.name" : "xcvxc66666", ...}},false,false);

但它不起作用......

1 个答案:

答案 0 :(得分:1)

位置运算符不能处理您尝试使用menus.$.items.$.name进行处理的级别数(https://jira.mongodb.org/browse/SERVER-831?focusedCommentId=22438&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel),即使它已执行MongoDB查询解析器也不知道是什么其他$来自find的{​​{1}}。

您需要从架构中提取项目,分别更新,然后更新根文档。

判断何时应该单独进行查询的一个好方法是认为每个菜单听起来像一个单独的实体(或关系数据库中的表),因此您可能应该更新这些实体(或关系模型中的表) )分别与父实体(表)。

首先,您将获得主根文档。在客户端滚动它的菜单,然后update该特定菜单滚动到您在客户端构建的整个项目。

修改

我想象这个工作客户端的方式是(伪代码,因为我的Java有点生疏)首先以活动的记录方式获取该文档:

$set

然后,您将遍历分配值的文档:

doc = db.col.find({ "_id" : { "$oid" : "506e9e54a4e8f51423679428"} , 
    "menus._id" : { "$oid" : "506e9e5aa4e8f51423679429"}});

然后在提交所有更改后简单保存文档:

foreach(doc.menus as menu_key => menu){
    foreach(menu['items'] as key => item){
        if(item._id ==  { "$oid" : "506e9f07a4e8f5142367942f"}){
            doc.menus[menu_key][key][name] = "xcvxc66666"
        }
    }
}

这当然只是一种方式,这种方式使用我个人喜欢的activen记录范例。在这个想法中,您可以将查找与您需要在文档上修改的所有内容相结合,在客户端构建它,然后将其作为单个查询发送到您的数据库。