在Mongodb中更新并返回文档

use*_*096 37 mongodb node.js

我想获得更新的文件.这是我的原始代码,它成功更新但不返回文档.

collection.update({ "code": req.body.code },{$set:  req.body.updatedFields}, function(err, results) {
                        res.send({error: err, affected: results});
                        db.close();
                    });
Run Code Online (Sandbox Code Playgroud)

我曾经使用过Array函数,但是这给出了错误"不能在没有提供回调的情况下使用writeConcern":

collection.update({ "code": req.body.code },{$set:  req.body.updatedFields}).toArray( function(err, results) {
                    res.send({error: err, affected: results});
                    db.close();
                });
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

Jon*_*ski 42

collection.update() 只会报告受其自身回调影响的文档数量.

要在修改时检索文档,可以collection.findOneAndUpdate()改为使用(以前.findAndModify()).

collection.findOneAndUpdate(
    { "code": req.body.code },
    { $set: req.body.updatedFields },
    { returnOriginal: false },
    function (err, documents) {
        res.send({ error: err, affected: documents });
        db.close();
    }
);
Run Code Online (Sandbox Code Playgroud)

请注意,它将修改.findOneAndUpdate期望{returnNewDocument: true}执行相同操作的所有匹配文档.

注意:从2.2版开始,当前是指Node.js驱动程序.对于将来的版本,请检查文档中的弃用警告,并使用推荐的替代方案.

  • 文档建议它只做一个文档,而不是多个 - (7认同)
  • 将```returnOriginal```选项设置为false将返回更新的对象 (5认同)
  • 它已被弃用了.使用`collection.findOneAndUpdate`代替! (4认同)
  • findOneAndUpdate似乎以修改前的状态检索文档。我认为问题的目标是获得结果对象 (3认同)

mil*_*nkb 9

解决方案是设置:{returnOriginal:false}。

collection.findOneAndUpdate(
        whereObj,
        updateObj,
        {returnOriginal: false});
Run Code Online (Sandbox Code Playgroud)


mid*_*ido 6

找不到任何方法来更新许多并返回docs中修改的记录,所以我做了一个解决方法。

我用下面的方法可以发现的至少一个错误是,您将无法判断文档是否被修改或已经具有您正在使用的值:

function findAndUpdateMany(filter, updateOptions) {
  return collection.find(filter).project({_id: 1}).toArray()
    .then(function(matchingIds) {
      filter = {_id: {$in: matchingIds}}
      return collection.updateMany(filter, updateOptions)
    }).then(function() {
      return collection.find(filter).toArray()
    })
}
Run Code Online (Sandbox Code Playgroud)