2014-09-12 8 views
1

Это мой MongoDB запрос:Почему мой запрос MongoDb вставляет встроенный документ в Update?

db.events.update({date:{$gte: ISODate("2014-09-01T00:00:00Z")}},{$set:{"artists.$.soundcloud_toggle":false}},{multi:true,upsert:false}) 

Видимо, я не могу использовать «художник $ soundcloud_toggle..», Чтобы обновить все художник документы в массиве художников:

«Оператор $ может обновить первый элемент массива, который соответствует несколько критериев запроса с указанным оператором $ elemMatch(). http://docs.mongodb.org/manual/reference/operator/update/positional/ "

Я рад выполнить запрос несколько раз изменяя индекс массива для того, чтобы установить soundcloud_toggle свойство каждого художника в каждом случае соответствует запросу, например

artists.0.soundcloud_toggle 
artists.1.soundcloud_toggle 
artists.2.soundcloud_toggle 
artists.3.soundcloud_toggle 

Проблема: когда есть говорю, только один художник документ в массиве художников и я выполнить запрос с «artists.1.soundcloud_toggle» Это будет вставить художник документ в массив художника с одним свойством:

{ 
    "soundcloud_toggle" : true 
}, 

(я объявил " upsert: false ", которое по умолчанию должно быть ложным)

Как остановить запрос от вставки документа и установки soundcloud_toggle: false, когда там нет существующего документа? Я хочу, чтобы он обновлял свойство, если художник существует в указанном индексе массива художников.

ответ

0

Если вы, как вы сказали, не возражаете выполнить операцию с несколькими запросами, вы можете добавить к вашему фильтру условие $exists.

E.g. на 5-й итерации при обновлении индекса = 4 добавить: "artists.4": {$exists: true}, например:

db.events.update(
    { date: {$gte: ISODate("2014-09-01T00:00:00Z")}, 
     "artists.4": {$exists: true} }, 
    { $set:{ "artists.4.soundcloud_toggle" :false } }, 
    { multi: true, upsert: false } 
) 
Смежные вопросы