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("507e9f07a4e8f514236) 7942fが更新される" があります。 .

次のクエリを使用してみました。

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.$.nameした場合でも、MongoDB クエリ パーサー$findupdate.

スキーマからアイテムを取り出し、それを個別に更新してから、ルート ドキュメントを更新する必要があります。

いつクエリを個別に実行する必要があるかを判断する 1 つの良い方法は、各メニューが個別のエンティティ (またはリレーショナル データベースのテーブル) のように聞こえると考えることです。そのため、これらのエンティティ (またはリレーショナル モデルのテーブル) を個別に更新する作業を行う必要があります。親エンティティ (テーブル)。

したがって、最初にメインのルート ドキュメントを取得します。クライアント側のメニューをスクロールしてから、$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);

もちろん、これは 1 つの方法に過ぎず、この方法では、私が個人的に気に入っているアクティブ レコード パラダイムを使用します。このアイデアでは、検索をドキュメントで変更する必要がある他のすべてのものと組み合わせて、クライアント側で構築し、すべてを 1 つのクエリとして DB に送信します。

于 2012-10-05T09:35:42.663 に答える