я следующий упрощенная схема:Mongoose - эффективное обновление индексированного массива mongoose.Schema.Types.Mixed
var restsSchema = new Schema({
name: String
menu: [mongoose.Schema.Types.Mixed]
});
Мой документ может выглядеть как:
{
name: "Sandwiches & More",
menu: [
{id:1,name:"Tona Sandwich",price: 10, soldCounter:0},
{id:2,name:"Salami Sandwich",price: 10, soldCounter:0},
{id:3,name:"Cheese Sandwich",price: 10, soldCounter:0}
]
}
Сборник rests
является индексируется:
db.rests.createIndex({ "menu.id": 1} , { unique: true })
Допустим, у меня есть этот массив идентификаторов [1,3]
и на основании этого мне необходимо увеличить soldCounter
на 1 из menu
предметов с идентификаторами = 1 или 3.
Каким должен быть эффективный способ?
спасибо за помощников!
РЕДАКТИРОВАТЬ: Я использовал следующее решение:
db.model('rests').update({ _id: restid,'menu.id': {$in: ids}}, {$inc: {'menu.$.soldCounter': 1}}, {multi: true},function(err) {
if(err)
console.log("Error while updating sold counters: " + err.message);
});
, где ids
является массив целых чисел с идентификаторами пунктов меню. restid
- это идентификатор конкретного документа, который мы хотим изменить в коллекции.
По какой-то причине обновляется только первый идентификатор в массиве ids
.
Вы уже реализовали то, что считаете недостаточно эффективным? – Antoine
Да, я обновил всю модель отдыха, которая довольно большая в своей неудовлетворительной форме. Я нашел остальное, используя 'find()', и в обратном вызове я искал желаемые проданные счетчики в цикле, увеличил их и сохранил модель. Неэффективен и может также вызвать некоторые проблемы с целостностью данных. – TBE