猫鼬 - 对猫鼬索引数组的高效更新.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]了这个 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();
});

最后,它只是一个查找和一个保存请求。

相关内容

  • 没有找到相关文章

最新更新