我有以下简化的方案:
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]
了这个 id 数组,基于此我需要将 soldCounter
个 ids=1 或 3 的项目menu
中的 1 个递增 1。
这样做必须有效的方法是什么?
感谢帮手!
编辑:我使用了以下解决方案:
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
是具有菜单项 ID 的整数数组。 restid
是我们要在集合中编辑的特定文档的 ID。
由于某种原因,仅更新ids
数组中的第一个 id。
有一种方法可以进行多次更新,这里是:只需确保要更新的数组中有索引即可。
var update = { $inc: {} };
for (var i = 0; i < indexes.length; ++i) {
update.$inc[`menu.${indexes[i]}.soldCounter`] = 1;
}
Rests.update({ _id: restid }, update, function(error) {
// ...
});
似乎
不可能一次更新多个子文档(请参阅此答案)。因此,查找和保存似乎是唯一的解决方案。
Rest.findById(restId).then(function(rest){
var menus = rest.menu.filter(function(x){
return menuIds.indexOf(x.id) != -1;
});
for (var menu of menus){
menu.soldCounter++;
}
rest.save();
});
最后,它只是一个查找和一个保存请求。