繁体   English   中英

Mongoose,如果找到更新,则创建

[英]Mongoose,if found update else create

好的,可以说我有这个数组:

const names = ["john","bill","mark"]

这个模型:

const namesSchema = new Schema({
  name: String,
  frequency: Number,
});

我想按名称搜索每个数组项,如果存在,只需将frequency数增加 1,否则创建name:array_itemfrequency:1的文档

我知道我可以只为forEach数组,并为每个名称执行以下操作:

names.forEach(i => {
  const name_doc = await namesSchema.findOne({
    name: i,
  });
  if (name_doc) {
    name_doc.frequency += 1;
    name_doc.save()
  } else {
    const new_name_doc = new namesSchema({
      name: i,
      frequency: 1,
    });
    new_name_doc.save()
  }
})

但我想知道是否有一种更具凝聚力的方法,我可以只传递数组,以及带有 upsert 选项的更新函数,它通过一次调用完成所有这些逻辑,无需迭代

这可能会帮助你。

我从收藏开始

[
    { "name": "mark" },
    { "name": "bill" },
    { "name": "john" }
]

并使用此查询按名称添加新文档或增加频率

db.collection.update({name:'mark'},{$inc:{"frequence":1}},{upsert:true})

编辑

或将数组传递给查询

const names = ["john", "bill", "mark"]

var updates= names.map(function(item) {
    return {
        "updateOne": {
            "filter": { name: item },
            "update": { $inc: { "frequence": 1 } },
            "upsert": true
        }
    };
});

db.collection.bulkWrite(updates, {})

或者

const names = ["john", "bill", "mark"]
    
names.map(function(item){
    db.collection.update({ name: item }, { $inc: { "frequence": 1 } }, { upsert: true })
}) 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM