Javascript 使用mongodb更新多个文档

Javascript 使用mongodb更新多个文档,javascript,node.js,mongodb,express,es6-promise,Javascript,Node.js,Mongodb,Express,Es6 Promise,如何迭代一组对象以使用mongodb更新文档,并将修改后的文档保留在响应中返回 注意代码中的注释 .put(function (req, res) { var data = req.body.data; var documents = []; for (var item in data) { var id = data[item]._id; var document = data[item]; Item.update(

如何迭代一组对象以使用mongodb更新文档,并将修改后的文档保留在响应中返回

注意代码中的注释

.put(function (req, res) {

    var data = req.body.data;
    var documents = [];
    for (var item in data) {

        var id = data[item]._id;
        var document = data[item];

        Item.update({ _id: id }, document, { overwrite: true }, function (err, item) {
          if (err) {
            res.send({'error':'Error'});
          }
          Item.findById(id, function (err, document) {
            if (err) {
              res.send({});
            }
            documents.push(document); // documents are pushed
          });

        });        
    }
    documents ; // value is []
    res.json({
      items: documents
    });        
}) 

由于
更新
是异步的,因此您的
文档
为空并立即返回。为每个更新创建承诺。还要创建一个外部承诺数组。将这些承诺推送到该数组,并在完成所有操作后发送响应。我正在使用

使用和代替。只要您的环境支持ES6构造,或者您导入了提供承诺的内容。all():

Promise.all(
请求主体数据映射(功能(文档){
var id=单据.\u id;
删除单据。\u id;
return Item.findByIdAndUpdate(id,doc,{“new”:true});
})
).然后(功能(文档){
res.json({“items”:documents})
});

不需要外部库。

这似乎是一个更好的解决方案,但是“return Item.findByIdAnUpdate(id,doc,{“new”:true})”引发了一个异常:“Type error不是一个函数”,而我将其改为“return{test:“test”},效果很好。@Jordi“typo”
.findByIdAnUpdate()
而不是
.findByIdAnUpdate()
和“
中缺少
”d“
。全部要点“是”和“是”都不需要额外的导入,其次,
.findbyidanddupdate()
优于
.update()
.findById()
的单独操作。不仅两次而不是一次访问服务器,而且文档在修改后也不是“真正”处于状态。其他操作可能在这两个系统中进行了修改。但是任何
.find**and update()
varaints都不是这样。是的,这是我的“输入错误”,对不起,谢谢@BlakesSeven。
.put(function (req, res) {

    var data = req.body.data;
    var documents = [];
    var promises = []
    for (var item in data) {

        var id = data[item]._id;
        var document = data[item];
        var itemDefer = Q.defer();

        Item.update({ _id: id }, document, { overwrite: true }, function (err, item) {
          if (err) {
            res.send({'error':'Error'});
          }
          Item.findById(id, function (err, document) {
            if (err) {
              itemDefer.reject(err);
            }
            itemDefer.resolve(document);
          });
        });  
        promises.push(itemDefer.promise);      
    }
    Q.all(promises).then(function(documents) {
        res.json({items: documents});    
    }, then(function(err) {
        res.send({})
    }))

})