我有一份需要更新的文件。但是,在旧文档中,可能有一个字段要我从更新中排除并保留。
我怎样才能做到这一点?
在下面的示例中,旧 positions
doc可能包含一个字段primary
,我想在更新之间保留这些字段。
Meteor.users.update(
{
type: SI.ENUM.USER.TYPE.BROADCASTER,
'positions._id': this.previous._id
},
{
$set: {'positions.$': doc}
},
{
multi: true
}
);
答案 0 :(得分:0)
要仅更新数组中子文档的特定元素,您必须在子文档的字段上使用位置运算符。
Meteor.users.update(
{
type: SI.ENUM.USER.TYPE.BROADCASTER,
'positions._id': this.previous._id
},
{
$set: {'positions.$.foo': newFoo, 'positions.$.bar': newBar }
},
{
multi: true
}
);
这将只更新foo
&数组中子文档的bar
个字段。
如果您在变量doc
中将值作为对象提供,则可以执行以下操作:
var keys = Object.getOwnPropertyNames(doc);
var newDoc = {}
keys.forEach(key => {
newDoc['positions.$.' + key] = doc[key];
});
Meteor.users.update(
{
type: SI.ENUM.USER.TYPE.BROADCASTER,
'positions._id': this.previous._id
},
{
$set: newDoc
},
{
multi: true
}
);
答案 1 :(得分:0)
findPositionAndUpdate: async(req, res, next) => {
let setObj = {};
Object.keys(req.body).forEach(key => {
if (key != "_id") {
setObj["positions.$." + key] = req.body[key];
}
});
let response = await Meteor.users.updateOne({ "positions._id": req.params.positionId }, {
$set: setObj
});
}
如果您想自动化您的请求正文,则可以使用上面的脚本,因为我来到这篇文章中搜索上面的内容。我的实现是在nodejs;-)