web-dev-qa-db-ja.com

MongoDB内部リストに要素を挿入する方法は?

次のドキュメントをMongoDBに保存しています。

{
    name: 'myDoc',
    list: [
        {
            id:1
            items:[
                {id:1, name:'item1'},
                {id:2, name:'item2'}
            ]
        },
        {
            id:2
            items:[
                {id:1, name:'item1'},
                {id:3, name:'item3'}
            ]
        }
    ]
}

$addToSetを使用して「リスト」に要素を追加する方法を見つけましたが、「アイテム」の特定のリストにアイテムを追加する方法が見つかりませんでした。

例えば私は次を取得します:

{id:5, name:'item5'} 

そして、id:2のリスト内の要素のアイテムに追加したいと思います。

45
Guy Korland

それを行う1つの方法は、$Pushを使用することです。

db.col.update(
    { name: 'doc', 'list.id': 2 }, 
    {$Push: {'list.$.items': {id: 5, name: 'item5'}}}
)

http://docs.mongodb.org/manual/reference/operator/Push/

$Pushを(おそらく)$addToSetなどの他の演算子に置き換えて、探している正確な結果を取得することもできます。

47
Sammaye

これを使用できます:-

> var toInsert = {id: 5, name: 'item6'}
> db.abc.update(
            { name: 'myDoc', list: { $elemMatch: { id: 2 } } },
            { $addToSet: { 'list.$.items': toInsert } }
  )

query部分は、id = 2list配列からドキュメントを見つけます。次に、$位置要素を使用して、その配列インデックスに新しい要素を追加します。

positional $ operator を参照してください


list: {$elemMatch: {id: 2}}'list.id': 2のみに置き換えることもできます。

ただし、配列の複数の要素に基づいて更新する場合は、 $elemMatch を使用する方が適切です。たとえば、一致基準がidであり、配列内の別のフィールドがlengthである場合:-

list: {$elemMatch: {id: 2, length: 5}}
13
Rohit Jain