1

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

メニューの自動更新を行いたい {
"name" : "gdfgdfgdfg",
"description" : "dfgdgd",
"text" : "dfgdfg",
"key" : "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"

}

しかし、同じ埋め込みドキュメントで更新したいです。

誰でも私を案内してください....事前に感謝します

4

1 に答える 1

0

わかりましたこれを数回読まなければならなかった後(英語...)私は今理解していると思います。

_idを使用してサブドキュメントまで次のように50656f3ca4e82d3f98291f00します。

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

最初の問題は、コードがmenusフィールドをこのオブジェクトに設定するだけであるということです。必要なのは位置演算子です。したがって、ドット表記の検索を行う必要があります(私の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);

うまくいけば、それでうまくいくはずです。

于 2012-09-28T14:05:46.063 に答える