sql >> データベース >  >> NoSQL >> MongoDB

mongoでネストされた配列ドキュメントを更新するクエリを構築するにはどうすればよいですか?

    位置演算子は、機能させようとしているレベルの数では機能しません( https://jira.mongodb.org/browse/SERVER-831?focusedCommentId=22438&page=com.atlassian.jira.plugin.system issuetabpanels%3Acomment-tabpanel menus.$.items.$.nameを使用 また、MongoDBクエリパーサーが実行したとしても、他の$が何であるかはわかりません。 findからのものです updateの 。

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

    クエリを個別に実行する必要があるかどうかを判断する良い方法の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つの方法にすぎず、この方法では、私が個人的に気に入っているactivenレコードパラダイムを使用します。このアイデアでは、検索結果をドキュメントで変更する必要のある他のすべてのものと組み合わせ、クライアント側で構築してから、すべてを1つのクエリとしてDBに送信します。




    1. mongodbのネストされたオブジェクトのフィールドを更新する方法は?

    2. mongodbリポジトリにカスタムクエリを書き込む

    3. Redis:挿入された要素が最初または最後にある場合、ZADDはO(logN)よりも優れていますか?

    4. MongoNetworkError:最初の接続でサーバー[localhost:27017]への接続に失敗しました[MongoNetworkError:connect ECONNREFUSED 127.0.0.1:27017]