【问题标题】:Mongoose Update *ONE* Field if Found Otherwise Create New With All FieldsMongoose 如果找到则更新 *ONE* 字段,否则使用所有字段创建新字段
【发布时间】:2017-03-15 12:55:10
【问题描述】:

假设我有一个包含多个字段的架构。如果文档与我的查询匹配,我只想更新 ONE 字段。但是,如果没有,我想创建一个包含所有字段值的新文档。有没有办法为此使用Model.findOneAndUpdate

这是更具体的代码以及我尝试过的代码:

var mg = require('mongoose');   
var Record = mg.model ("record", {
  field1: Number,
  field2: Number,
  field3: Number,
});

//Update field1 ONLY if found using findOneAndUpdate, else create with all fields
var query = {//My Query},
    update = {field1: 10},
    options = {upsert: true, new: true, setDefaultsOnInsert: true};

Record.findOneAndUpdate(query, update, options, function(err,result){
  //Do stuff with doc
});

以上代码正确更新field1,但是当没有文档匹配查询时,会创建一个没有field2field3的新文档

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    啊,我阅读了upsert 上的文档并意识到我需要在我的update 对象中包含更新运算符并使用$setOnInsert。顾名思义,只有在插入新文档时才会设置与此运算符关联的值。所以从问题中修复了代码

    var mg = require('mongoose');   
    var Record = mg.model ("record", {
      field1: Number,
      field2: Number,
      field3: Number,
    });
    
    //Update field1 ONLY if found using findOneAndUpdate, else create with all fields
    var query = {//My Query},
        update = {
          $set:{field1: 10},
          $setOnInsert:{field2: ..., field3: ...}
        },
        options = {upsert: true, new: true, setDefaultsOnInsert: true};
    
    Record.findOneAndUpdate(query, update, options, function(err,result){
      //Do stuff with doc
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-27
      • 2017-09-18
      • 1970-01-01
      • 2020-08-19
      • 2020-04-10
      • 2022-11-18
      • 2014-02-05
      • 1970-01-01
      相关资源
      最近更新 更多