假设我有一个包含多个字段的模式。如果文档与我的查询匹配,我只想更新 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
,但是当没有文档与查询匹配时,创建的新文档没有field2
或field3
答案 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
});