使用具有投影和唯一验证的Mongoose.js创建文档

时间:2019-08-21 23:38:34

标签: node.js mongodb mongoose

创建文档时,是否可以使用与findOneAndUpdate()相同的选项。我知道可以设置upsert: true,但是如果文档已经存在,我想抛出一个错误。

所以说我的数据库中有课程,以及何时插入新课程。如果使用.create(),我将无法投影或使用精益。 :dis 如果我使用findOneAndUpdate,则它不会对具有重复字段的文档引发错误,因为它正在更新为我不想执行的现有文档。

基本上,我想使用.findOneAndUpdate()附带的功能,但是如果它找到文档,我希望它引发错误,因为我是根据希望唯一的字段进行搜索的

2 个答案:

答案 0 :(得分:0)

通过查找问题,您可以尝试以下方法

function updateUser(user,cb){
    UserModel.find({name : user.name}, function (err, docs) {
        if (docs.length){
            cb('Name exists already',null);
        }else{
             user.save(function (err, returned) {
             var leanObject = returned.toObject();
             assert.equal(leanObject.schema, null);
             });

        }
    });
}

因此,在上面的代码中,您找到了该文档,并且如果得到的结果为非空,则可以将其视为错误,否则可以将该文档另存为新条目。

答案 1 :(得分:0)

因此,为了实现预期的目标,我做了以下工作。我在其中知道会失败的查询条件。这样一来,我就可以强制使用高手,并从这些选项中受益。

  async addCourse(input, projection = {}) {
    const { name } = input;

    const conditions = { _id: mongoose.Types.ObjectId() };
    const newCourse = await this.model.findOneAndUpdate(conditions, input, {
      upsert: true,
      new: true,
      lean: true,
      projection,
      runValidators: true,
      context: 'query',
      setDefaultsOnInsert: true,
    });

    return newCourse;
  }