16

以下は MongoDB ドキュメントです。

{
    "_id" : 2,
    "mem_id" : M002,
    "email" : "xyz@gmail.com",
    "event_type" : [ 
        {
            "name" : "MT",
            "count" : 1,
            "language" : [ 
                {
                    "name" : "English",
                    "count" : 1,
                    "genre" : [ 
                        {
                            "name" : "Action",
                            "count" : 6
                        }, 
                        {
                            "name" : "Sci-Fi",
                            "count" : 3
                        }
                    ],
                    "cast" : [ 
                        {
                            "name" : "Sam Wortington",
                            "count" : 2
                        }, 
                        {
                            "name" : "Bruce Willis",
                            "count" : 4
                        }, 
                        {
                            "name" : "Will Smith",
                            "count" : 7
                        }, 
                        {
                            "name" : "Irfan Khan",
                            "count" : 1
                        }
                    ]
                }
            ]
        }
    ]
}

入れ子になっているため、特に event_type、language、genre、cast などの配列型のフィールドを更新できません。基本的に、言及された 4 つのフィールドすべてと、それぞれのサブドキュメントのカウント フィールドを更新したかったのです。update ステートメントは、値が新しい場合はツリーに値を挿入する必要があり、それ以外の場合はその値のカウントをインクリメントする必要があります。
mongo シェルのクエリは何ですか? ありがとう

4

2 に答える 2

21

MongoDB の現在の制限の 1 つに直接ぶつかっています。問題は、エンジンが複数の位置演算子をサポートしていないことです。これを参照してくださいネストされた配列を更新するために位置 `$` 演算子を複数使用する

これにはオープン チケットがあります: https://jira.mongodb.org/browse/SERVER-831 (そこにも記載されています)

データモデルを変更する方法については、これを読むこともできます: mongodb でネストされた配列を更新する

実行可能な場合は、次のことができます。

db.collection.update({_id:2,"event_type.name":'MT' ,"event_type.language.name":'English'},{$set:{"event_type.0.language.$.count":<number>}})

db.collection.update({_id:2,"event_type.name":'MT' ,"event_type.language.name":'English'},{$set:{"event_type.$.language.0.count":<number>}})

ただし、次のことはできません。

db.collection.update({_id:2,"event_type.name":'MT' ,"event_type.language.name":'English'},{$set:{"event_type.$.language.$.count":<number>}})
于 2013-09-02T13:17:33.340 に答える