gpt4 book ai didi

javascript - mongoose findOneAndUpdate 仅附加对象

转载 作者:可可西里 更新时间:2023-11-01 09:48:54 24 4
gpt4 key购买 nike

我有一个如下的对象;

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
}
});

最佳答案

你的问题乍看起来令人生畏,但解决方案很简单,你不需要使用 $ 或 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 检查了本地数据库上的代码

关于javascript - mongoose findOneAndUpdate 仅附加对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39875612/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com