次のドキュメントを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のリスト内の要素のアイテムに追加したいと思います。
それを行う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
などの他の演算子に置き換えて、探している正確な結果を取得することもできます。
これを使用できます:-
> var toInsert = {id: 5, name: 'item6'}
> db.abc.update(
{ name: 'myDoc', list: { $elemMatch: { id: 2 } } },
{ $addToSet: { 'list.$.items': toInsert } }
)
query
部分は、id = 2
でlist
配列からドキュメントを見つけます。次に、$
位置要素を使用して、その配列インデックスに新しい要素を追加します。
positional $ operator
を参照してください
list: {$elemMatch: {id: 2}}
を'list.id': 2
のみに置き換えることもできます。
ただし、配列の複数の要素に基づいて更新する場合は、 $elemMatch
を使用する方が適切です。たとえば、一致基準がid
であり、配列内の別のフィールドがlength
である場合:-
list: {$elemMatch: {id: 2, length: 5}}