更新除指定字段外的整个文档

时间:2017-01-17 10:13:31

标签: mongodb meteor

我有一份需要更新的文件。但是,在旧文档中,可能有一个字段要我从更新中排除并保留。

我怎样才能做到这一点?

在下面的示例中, positions doc可能包含一个字段primary,我想在更新之间保留这些字段。

Meteor.users.update(
  {
    type: SI.ENUM.USER.TYPE.BROADCASTER,
    'positions._id': this.previous._id
  },
  {
    $set: {'positions.$': doc}
  },
  {
    multi: true
  }
);

2 个答案:

答案 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;-)