本文介绍了findOneAndUpdate 覆盖作为 doc 传递的 2+ 级深度对象中的属性的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
假设我有这个架构:
var UserSchema = new Schema({
name : {
firstName : String,
lastName : String
}
});
我创建了这个用户:
User.create({
name : {
firstName : Bob,
lastName : Marley
}
}, function (err, user) {
if(err) {
return console.error(err);
} else {
return console.log(user);
}
});
我注意到如果我这样做:
I noticed that if I do this:
User.findOneAndUpdate({_id: userId}, { name: { firstName : "Damian" } }, function (err, user) {
if(err) {
return console.error(err);
} else {
return console.log(user);
}
});
我现在的用户是:
user = {
name : {
firstName : "Damian"
}
}
但是,如果我这样做:
User.findOneAndUpdate({_id: userId}, { "name.firstName" : "Damian" }, function (err, user) {
if(err) {
return console.error(err);
} else {
return console.log(user);
}
});
我的用户是:
user = {
name : {
firstName : "Damian",
lastName : "Marley"
}
}
有没有一种方法可以将一个没有填写所有属性的对象传递给 findOneAndUpdate
,并保留之前存在的属性而不删除它们?(与 Mongo 中的 $set
功能相同).这真的很烦人...
Is there a way to pass an Object with not all of its attributes filled out to findOneAndUpdate
, and keep the attributes that were there before, without getting rid of them? (same functionality as $set
in Mongo). This is really annoying...
推荐答案
使用 flat,像这样:
var flatten = require('flat')
flatten({
name : {
firstName : "Damian"
}
})
// {
// 'name.firstName': 'Damian'
// }
现在您可以像在第二个示例中一样调用 findOneAndUpdate
.
And now you can call findOneAndUpdate
exactly as you did in your second example.
这篇关于findOneAndUpdate 覆盖作为 doc 传递的 2+ 级深度对象中的属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!