使用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