在Mongodb中更新并返回文档

时间:2014-07-14 22:38:43

标签: node.js mongodb

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

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

我曾经使用过阵列功能,但这给出了错误"如果没有提供回调就不能使用writeConcern":

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

有什么想法吗?

4 个答案:

答案 0 :(得分:29)

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

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

collection.findOneAndUpdate(
    { "code": req.body.code },
    { $set: req.body.updatedFields },
    { new: true },
    function (err, documents) {
        res.send({ error: err, affected: documents });
        db.close();
    }
);

请注意,它会修改.update()期望multi: true执行此操作的所有匹配文档。

  

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

答案 1 :(得分:7)

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

collection.findOneAndUpdate(
        whereObj,
        updateObj,
        {returnOriginal: false});

答案 2 :(得分:1)

无法找到更新许多内容并在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()
    })
}

答案 3 :(得分:-4)

签出WriteResult对象:

http://docs.mongodb.org/manual/reference/method/db.collection.update/#writeresults-update

WriteResult result = collection.update({ "code": req.body.code },{$set:  req.body.updatedFields}, function(err, results) {
                    res.send({error: err, affected: results});
                    db.close();
                });

结果应该是这样的:

WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

如果您想要更新结果,请使用主键执行另一个查询。