Как вставить элемент в внутренний список 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.
Ответы
Ответ 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
, чтобы получить точные результаты, которые вы ищете.
Ответ 2
Вы можете использовать это: -
> var toInsert = {id: 5, name: 'item6'}
> db.abc.update(
{ name: 'myDoc', list: { $elemMatch: { id: 2 } } },
{ $addToSet: { 'list.$.items': toInsert } }
)
Часть query
найдет документ из массива list
с id = 2
. Затем мы используем элемент $
positional для добавления нового элемента в этот индекс массива.
См. positional $ operator
Вы также можете заменить list: {$elemMatch: {id: 2}}
на 'list.id': 2
.
Но использование $elemMatch
будет лучше, если вы хотите обновить на основе нескольких элементов вашего массива. Например, когда ваши критерии соответствия id
, а другое поле в массиве говорит length
: -
list: {$elemMatch: {id: 2, length: 5}}