是否可以使用Mongoose一次性设置(子)文档的多个属性?我正在try 做的一个例子:

假设我有这个模式:

var subSchema = new Schema({
    someField: String,
    someOtherField: String
});

var parentSchema = new Schema({
    fieldOne: String,
    subDocs: [subSchema]
})

那么我想做:

exports.updateMyDocument = function(req, res) {
    var parentDoc = req.parentDoc; // The parent document. Set by parameter resolver.
    var document = req.myDoc; // Sub document of parent. Set by parameter resolver.
    var partialUpdate = req.body; // updated fields sent as json and parsed by body parser
    // I know that the statement below doesn't work, it's just an example of what I would like to do.
    // Updating only the fields supplied in "partialUpdate" on the document
    document.update(partialUpdate); 
    parentDoc.save(function(err) {
        if(err) {
            res.send(500);
            return;
        }
        res.send(204);
    }); 
};

通常,我可以使用$set操作符来实现这一点,但我的问题是,在这个示例中,documentparentDoc的子文档(嵌入式模式).所以当我试着

Parent.update({_id: parentDoc._id, "subDocs._id": document._id}, 
    {$set: {"subDocs.$" : partialUpdate}}, 
    function(err, numAffected) {});

它替换了由subDocs._id标识的子文档实例.目前,我已经通过手动设置字段"解决"了这个问题,但我希望有更好的方法来实现这一点.

推荐答案

基于partialUpdate的字段以编程方式构建一个$set对象,使用点符号仅更新这些字段:

var set = {};
for (var field in partialUpdate) {
  set['subDocs.$.' + field] = partialUpdate[field];
}
Parent.update({_id: parentDoc._id, "subDocs._id": document._id}, 
    {$set: set}, 
    function(err, numAffected) {});

Mongodb相关问答推荐

防止查找简单字段

在Mongoose中对嵌套文档设置时间戳,但不对父文档设置时间戳

在不知道字段名称的情况下如何引用 MongoDB 中的字段?

如何通过 Go 以 UUID 类型保存 Mongo 中的内容?

Mongo聚合的具体格式

如何为具有相同名称的嵌套字段创建文本索引

如何判断 MongoDB 的两个数组中是否存在值?

在 MongoDB 中,如何使用对当前值进行操作的函数来更新嵌套文档的值?

Spring Data + MongoDB GridFS 可以通过 Repository 访问吗?

替换 MongoDB 中数组中的嵌入文档

NodeJS + MongoDB:使用 findOne () 从集合中获取数据

Mongo C#忽略属性

增加嵌套对象中的值?

MongoError:$subtract 累加​​器是一元运算符

MongoDB - 如果新值更大,则更新字段

如何使用 C# MongoDB 驱动程序检索字段子集?

如何在 Mongoose 中更新数组值

Mongoose 不创建新集合

java.lang.IncompatibleClassChangeError:Implementing class Mongo

使用自定义 _id 值时 mongodb 中的 Upserts