2015-08-21 3 views
1

У меня возникли проблемы с пониманием того, как новые field:valueobjects добавлены в базы данных mongo.Mongoose: как вставить поле/значение в существующий поддокумент

Скажем, у меня есть следующие document:

var people={'firstname': 'John','surname':'Smith', 
'favouritefood':[{'fruit':'apples','drink':'coffee'}]} 

как добавить «овощ»: «брокколи» к «любимой пищи» так это выглядит следующим образом:

{'firstname': 'John','surname':'Smith', 
'favouritefood':[{'fruit':'apples','drink':'coffee','vegetable':'broccoli'}]} 

Если я печатаю :

people.findOneAndUpdate({'firstname':'John'}, 
{$push {favouritefood: {vegetable:broccoli}}}, 
{upsert:true}) 

это дает мне это:

{'firstname': 'John','surname':'Smith', 
'favouritefood':[{'fruit':'apples','drink':'coffee'},{'vegetable':'broccoli'}]} 

и если я стараюсь:

people.findOneAndUpdate({'favoritefood':'apples'}, 
{$push {vegetable:broccoli}}}, 
{upsert:true}) 

он говорит:

'$push' is empty. You must specify a field like so: {$push: {<field>: ...}} 

Любая помощь очень ценится!

+1

Причина условия запроса {'favoritefood': 'apples'} не будет соответствовать значению. Оператор $ push добавляет указанное значение в массив. Но на самом деле вы хотите добавить значение в {'fruit': 'apples', 'drink': 'coffee'}, который не является массивом. Если возможно, сделать зеркальное изменение структуры документа как '' 'favouritefood: [{'fruit': 'apples'}, {'drink': 'coffee'}]' '', тогда ваш код будет работать. –

+0

Думаю, мне придется это сделать. Но кажется странным, что вам дана возможность создать что-то вроде 'favouritefood: [{'fruit': 'apples', 'drink': 'coffee'}]', но потом не редактировать его. – qts

+0

Я имею в виду, что вы перепроектируете свою структуру документа, поскольку каждый элемент {'fruit': 'apples'} будет элементом в favouritefood. Вставляемый код вручную изменяется :). –

ответ

1

Я думаю, что вы будете в состоянии обновить favouritefood массив первого объекта следующий this синтаксис

Но я предлагаю вам то же самое, что люди в комментариях, изменить свою структуру еще один естественный в MongoDB. Рассмотрим каждую категорию пищи как элемент массива, а не поле объекта первого элемента.

+0

Я понимаю комментарии и буду следовать за ними, но я не думаю, что способ, которым я его настроил, как-то необычен. В конце концов, внедрение ожидается и поощряется, и есть даже примеры в http://docs.mongodb.org/manual/core/data-modeling-introduction/, которые рассматривают очень похожую настройку. – qts

+0

Вот как я наконец сделал это: 'people.findOneAndUpdate ({'favoritefood.fruit': 'apples'}, {$ set {'favorite. $. Vegetable': 'broccoli'}}}, {upsert: true }) ' – qts

Смежные вопросы