【问题标题】:How to update embedded document in mongo?如何更新 mongo 中的嵌入文档?
【发布时间】:2012-09-28 22:05:46
【问题描述】:

我在 mongo db 中有以下文档。

  { "_id" : ObjectId("50656f33a4e82d3f98291eff"), 
     "description" : "gdfgdfgdfg",
     "menus" : [    
               {    
                 "name" : "gdfgdfgdfg",     
                  "description" : "dfgdgd",     
                  "text" : "dfgdfg",    
                  "key" : "2",  
                  "onSelect" : "yyy",   
                  "_id" : ObjectId("50656f3ca4e82d3f98291f00") 
              }, 
               {    
                 "name" : "rtytry",     
                  "description" : "gffhf",  
                  "text" : "dfgdfg",    
                  "key" : "2",  
                  "onSelect" : "yyy",   
                  "_id" : ObjectId("50656f3ca4e82d3f98281f00") 
              }],
      "select":"ffdfgd"
   }

我想自动更新菜单 {
“名称”:“gdfgdfgdfg”,
“描述”:“dfgdgd”,
“文本”:“dfgdfg”,
“关键”:“2”,
"onSelect" : "yyy",
"_id" : ObjectId("50656f3ca4e82d3f98291f00") }

我已尝试使用以下代码:

         BasicDBObject query = new BasicDBObject("_id", new ObjectId("50656f33a4e82d3f98291eff"));

         BasicDBObject update = new BasicDBObject("_id", ObjectId("50656f3ca4e82d3f98291f00"));

         BasicDBObject updateCommand = new BasicDBObject("$set", new BasicDBObject("menus", update));

         collection.update(query, updateCommand);

我得到的结果是

  { "_id" : ObjectId("50656f33a4e82d3f98291eff"), 
 "description" : "gdfgdfgdfg",
 "menus" :    
           {    
             "name" : "gdfgdfgdfg",     
              "description" : "dfgdgd",     
              "text" : "dfgdfg",    
              "key" : "2",  
              "onSelect" : "yyy",   
              "_id" : ObjectId("50656f3ca4e82d3f98291f00") 
          },
  "select":"ffdfgd"

}

但我想在同一个嵌入文档中更新。

任何人指导我....提前谢谢

【问题讨论】:

    标签: java mongodb


    【解决方案1】:

    好的,在读了几遍之后(英语...)我想我现在明白了。

    您希望使用 _id 50656f3ca4e82d3f98291f00 更新子文档:

    {
    "name" : "gdfgdfgdfg",
    "description" : "dfgdgd",
    "text" : "dfgdfg",
    "key" : "2",
    "onSelect" : "yyy",
    "_id" : ObjectId("50656f3ca4e82d3f98291f00") 
    } 
    

    您遇到的第一个问题是您的代码仅将menus 字段设置为该对象。您需要的是位置运算符。所以你需要做一个点符号find(警告我的Java有点生疏):

    query.append("menus._id", new ObjectId("50656f3ca4e82d3f98291f00"));
    

    然后使用那个位置操作符来更新位置:

    BasicDBObject update_document = new BasicDBObject("menus.$.name", my_new_subdocument.name);
    update_document.append("menus.$.description", my_new_subdocument.description);
    // All the other fields
    
    BasicDBObject updateCommand = new BasicDBObject("$set", update_document);
    

    希望这样可以解决问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-15
      • 2020-05-25
      • 1970-01-01
      • 2011-05-21
      • 1970-01-01
      • 1970-01-01
      • 2013-06-12
      • 2022-01-17
      相关资源
      最近更新 更多