2013-10-26 1 views
0

У меня есть коллекция документов для формы:

{ name:String, groceries:{ apples:Number, cherries:Number, prunes:Number } } 

Теперь каждый запрос я должен инкремент с положительными и/или отрицательными значениями для каждого элемента в «бакалее». Не важно, какие ключи или сколько, я просто добавил несколько примеров.

Я мог бы сделать:

var dataToBeIncremented = stuff; 
var $inc = {}; 
for each(var index in dataToBeIncremented) 
{ 
    $inc[ "groceries." + index ] = dataToBeIncremented[ index ]; 
} 

затем

db.update({ _id:targetID }, { $inc : query }) 

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

Я хотел бы знать, как аннулировать это и почему его нельзя оптимизировать.

ответ

1

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

Таким образом, единственный способ сделать это, чтобы сделать что-то, как вы сделали:

{ 
    "$inc": { 
     "groceries.apples" : 1, 
     "groceries.cherries" : 1, 
     "groceries.prunes" : 1 
    } 
} 

Потому что вы не знаете, какие поля точно, вам нужно найти их заранее и создать $ вкл заявление. В этих обновлениях есть одна хорошая вещь: независимо от того, как могут быть ваши элементы, вам все равно потребуется всего 2 запроса (найти, что обновлять и фактически выполнять обновление).

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

+0

Я боялся этого. ура – Discipol

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

  • Нет связанных вопросов^_^