Mongoose更新* ONE *字段如果找到,否则创建新的所有字段

时间:2017-03-15 04:41:32

标签: node.js mongodb mongoose

假设我有一个包含多个字段的模式。如果文档与我的查询匹配,我只想更新 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

1 个答案:

答案 0 :(得分:0)

啊,我阅读了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
});