使用nodejs / mongoose部分更新子文档

使用Mongoose可以一次性在一个(子)文档上设置多个属性吗?我正在尝试做的一个例子:

假设我有以下架构:

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运算符来实现此目的,但是我的问题是document在此示例中是的子文档(嵌入式架构)parentDoc。所以当我尝试去做

Parent.update({_id: parentDoc._id, "subDocs._id": document._id}, 

{$set: {"subDocs.$" : partialUpdate}},

function(err, numAffected) {});

它替换了由标识的子文档实例subDocs._id。目前,我已经通过手动设置仅字段来“解决”它,但是我希望有一种更好的方法来做到这一点。

回答:

$set基于的字段partialUpdate以编程方式构建对象,以使用点表示法仅更新这些字段:

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

以上是 使用nodejs / mongoose部分更新子文档 的全部内容, 来源链接: utcz.com/qa/410263.html

回到顶部