mongoose findOneAndUpdate只追加对象
mongoose findOneAndUpdate appends objects only
我有一个像这样的对象;
var exObj = { 'title' : 'name1'};
它们中的一些具有对象的数据属性(不是我想通过名称引用的数组),看起来像
exObj = {
title : 'name2',
data : {
prop1 : 'prop1',
prop2 : 'prop2'
}
}
现在我想给data添加另一个属性,有时data属性会存在,有时不存在,但我想添加一个属性(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(),但后来我没有一个合适的猫鼬对象来做。
进一步说明;这对简单的属性是有效的(而且效果很好)我知道这些属性是固定的;有一些值我希望添加,我需要检查他们是否有一个值的属性添加属性
就像这样;
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
}
});
您的问题首先看起来令人生畏,但解决方案很简单,您不需要使用$或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检查了本地db上的代码
您需要使用点符号来定位嵌入对象中的特定字段,根据提供的字段构建更新对象:
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) {
相关文章:
- 包含数组的对象的QML ListModel追加中断
- 对象没有方法'追加'-需要快速帮助
- 追加子数据 URI,替换 IE 中的其他对象
- 在对象中追加或编辑函数的最快方法是什么
- JQuery选择器找不到通过追加添加的对象
- Angularjs:错误:'追加'对未实现接口FormData的对象调用.jQuery.param/ad
- 动画对象在分离和追加后不继续动画
- 追加到对象文本
- 无法与使用 jquery 追加添加的 dom 对象进行交互
- 在本地存储中追加对象
- 将数据追加到本地存储对象
- 选择菜单更改仅在第一个事件上追加对象列表
- jQuery,添加可拖动到追加对象
- 将对象追加到 JSON 列表
- 将选项对象的数组追加到多个选择
- 将文本从对象追加到文本区域不工作
- 在向formData对象追加新值时遇到问题
- 递归地迭代对象,并向每个子对象追加父对象
- 使用strongloop的简单mongo对象追加启动
- JQuery 将对象追加到追加的对象