56

次のドキュメントが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のリストの要素のアイテムに追加したいと思います。

4

2 に答える 2

60

それを行う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、探している正確な結果を取得することもできます。

于 2012-12-21T09:30:00.640 に答える
18

あなたはこれを使うことができます:-

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

queryパーツは、。を使用して配列からドキュメントを検索しlistますid = 2。次に、$positional elementを使用して、その配列インデックスに新しい要素を追加します。

見るpositional $ operator


list: {$elemMatch: {id: 2}}だけで置き換えることもできます'list.id': 2

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

list: {$elemMatch: {id: 2, length: 5}}
于 2012-12-21T09:30:39.407 に答える