0

我在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") 
  }

我有主文档ID:“_id ”:ObjectId(“506e9e54a4e8f51423679428”)菜单ID“_id”:ObjectId(“506e9e54a4e8f51423679428”)以及项目ID “_id”:ObjectId(“507e9f07a4e8f5142367942”) .

我尝试使用以下查询:

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

但它不工作......

4

1 回答 1

1

位置运算符不适用于您尝试使其工作的级别数(https://jira.mongodb.org/browse/SERVER-831?focusedCommentId=22438&page=com.atlassian.jira.plugin.system .issuetabpanels%3Acomment-tabpanel )和即使它做了menus.$.items.$.nameMongoDB 查询解析器也不知道另一个$来自find.update

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

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

所以首先你会得到主根文档。滚动浏览客户端的菜单,然后滚动$set该特定菜单到您在客户端构建的整个项目。

编辑

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

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"
        }
    }
}

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

db.col.save(doc);

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

于 2012-10-05T09:35:42.663 回答