我有一个像下面这样的对象;
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()但是我没有正确的猫鼬对象来执行.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
}
});
答案 0 :(得分:1)
你的问题首先看起来令人生畏,但解决方案很简单,你不需要使用$或upsert,因为你没有使用任何数组,所以不需要位置运算符或upsert。您可以使用以下代码。
Collection.findOneAndUpdate({
title: 'name2'
},{
$set:{"data.prop3":"new prop3"}
})
.exec(function(err) {
if (err) {
console.log(err);
} else {
console.log('Updated');
}
});
如果不存在,它将添加prop3,或者如果它存在,它将更新它。我已使用update和findOneAndUpdate
检查了本地数据库中的代码答案 1 :(得分:0)
您需要使用dot notation定位嵌入对象中的特定字段,根据提供的字段构建更新对象:
var update = {};
if (tObj.title) {
update.title = tObj.title;
}
if (tObj.data) {
if (tObj.data.prop1) {
update['data.prop1'] = tObj.data.prop1;
}
if (tObj.data.prop2) {
update['data.prop2'] = tObj.data.prop2;
}
if (tObj.data.addedProp) {
update['data.addedProp'] = tObj.data.addedProp;
}
}
Collection.findOneAndUpdate({
title: 'name2'
}, {
$set: update
}, {
upsert: true
})
.exec(function(err) {