本文介绍了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+ 级深度对象中的属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!