我有一个像下面这样的对象;
但是显然这会覆盖已有的数据对象;正确的方法是如何进行 findOneAndUpdate 并对对象进行更有意义的更改?我尝试将其转换为 toObject(),但是那样我就没有一个适当的 mongoose 对象来执行 .save()。进一步澄清一下,这对于简单属性(并且效果很好)可以使用,我知道它们被设置了;但是我想添加一些值,需要在添加属性之前检查它们是否具有该属性的值。因此,类似于这样的东西:
var exObj = { 'title' : 'name1'};
其中一些具有对象的数据属性(不是我想要按名称引用的数组),看起来像这样:
exObj = {
title : 'name2',
data : {
prop1 : 'prop1',
prop2 : 'prop2'
}
}
现在我想向数据添加另一个属性,有时数据属性存在,有时不存在,但我想添加一个属性(addedProp)并保存它,最终得到这样的结果;
exObj = {
title : 'name2',
data : {
prop1 : 'prop1',
prop2 : 'prop2',
addedProp : 'value'
}
}
使用findOneAndUpdate时,我似乎只能传入一个完整的对象,然后将其附加;目前我所做的就像这样。
var data = {};
data.addedProp = value;
Collection.findOneAndUpdate({
title: 'name2'
}, {
data
}, {
upsert: true
})
.exec(function(err) {
if (err) {
console.log(err);
} else {
console.log('Updated');
}
});
但是显然这会覆盖已有的数据对象;正确的方法是如何进行 findOneAndUpdate 并对对象进行更有意义的更改?我尝试将其转换为 toObject(),但是那样我就没有一个适当的 mongoose 对象来执行 .save()。进一步澄清一下,这对于简单属性(并且效果很好)可以使用,我知道它们被设置了;但是我想添加一些值,需要在添加属性之前检查它们是否具有该属性的值。因此,类似于这样的东西:
Collection.findOneAndUpdate({
field: val
}, {
if (tObj.title) {
title = tObj.title;
}
if (tObj.date) {
release_date = tObj.date;
}
if (tObj.name) {
name = tObj.name;
}
}, { upsert: true
})
.exec(function(err) {
if (err) {
//handler
} else {
//handler
}
});
Collection.findOneAndUpdate({ "title": "name2" }, { "data": data }, { upsert: true }).exec(callback)
吗? - chridam