2015-07-26 2 views
0

Добрый вечер. У меня есть этот документ MongoDB. enter image description hereMongoDB - обновление денормализованного рисунка

Этот документ содержит информацию о тренере итальянской компании M. Allegri. Массив coached_Team содержит все команды, которые Аллегри тренировал. В этом примере есть только одна команда, но это всего лишь тест; у одного тренера много команды в массиве coached_Team. Есть ли способ обновить palmarès только одной команды?
Например, «Ювентус» в прошлом году выиграл 1 серию А и 1 «Коппа Италия». Этот запрос, очевидно, не работает, потому что в этом массиве будет Пальмареса всех команд, которые Аллегри тренировали:

db.coach.update({_id:"MA_1967"}, {$set: {"coached_Team.palmarès.Serie A":33}}) 

Итак, я думал использовать нормированную модель вместо денормализованной. Но я хочу знать, есть ли способ обновить ладони Ювентуса, например, используя этот денормализованный шаблон.
Спасибо.

ответ

1

Да, вы можете использовать оператор позиционирования MongoDB в своем операторе обновления. Оператор позиционирования $ имеет некоторые оговорки для чтения, но вы можете написать свой запрос следующим образом.

db.coach.update({_id:"MA_1967", 'coached_Team': "Juventus"}, {$set: {"coached_Team.$.palmarès.Serie A":33}}) 

для того, чтобы использовать $ позиционного оператора вы должны включать один и только один атрибут массива в вашей находке. Тогда $ будет соответствовать только первому элементу массива, который соответствует документу, который вы ищете. Поэтому ваш оператор обновления читает что-то вроде «установите первый элемент в coached_Team, который соответствовал моему запросу массива», затем вы получаете доступ к атрибутам palmares и Serie A через позиционный оператор $. Операторы $ и elemMatch являются очень мощными, но, к сожалению, иногда очень запутанными, операторы читают в MongoDB.

+0

Отлично. Он работает отлично. спасибо – DistribuzioneGaussiana

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