Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/451.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何强制Mongoose Save()调用是同步的_Javascript_Mongodb_Mongoose - Fatal编程技术网

Javascript 如何强制Mongoose Save()调用是同步的

Javascript 如何强制Mongoose Save()调用是同步的,javascript,mongodb,mongoose,Javascript,Mongodb,Mongoose,我正在Node.js中编写一个脚本,需要执行以下操作: 打开XML文件 对于文件中的每个节点 执行mongodb查找以尝试查找与此节点相关的对象 如果找不到对象,则创建它,否则以某种方式操纵找到的对象 将(可能是新的)对象保存回数据库 转到步骤2 我已经对此研究了一段时间,并得出结论,使用异步mongodb几乎不可能做到这一点。问题是多方面的,但例如,如果处理20000个这样的节点,那么异步执行将挂起脚本。但是,将它们作为批插入执行也不可行,因为步骤4需要查看对象是否已经存在 可以将一些可怕的东

我正在Node.js中编写一个脚本,需要执行以下操作:

  • 打开XML文件
  • 对于文件中的每个节点
  • 执行mongodb查找以尝试查找与此节点相关的对象
  • 如果找不到对象,则创建它,否则以某种方式操纵找到的对象
  • 将(可能是新的)对象保存回数据库
  • 转到步骤2
  • 我已经对此研究了一段时间,并得出结论,使用异步mongodb几乎不可能做到这一点。问题是多方面的,但例如,如果处理20000个这样的节点,那么异步执行将挂起脚本。但是,将它们作为批插入执行也不可行,因为步骤4需要查看对象是否已经存在

    可以将一些可怕的东西拼凑在一起,缓存创建的对象,然后将它们保存为类似步骤7的内容,但这会很困难,因为这些对象要进入多个集合,并且在步骤4,您需要首先尝试从缓存中查找对象,然后从数据库中查找对象。如果这就是解决方案,那么我将把Javascript写为已损坏,并用perl编写它。所以我的问题是,对于像上面这样简单的动作序列,我能不能强制mongodb同步,这样我的脚本就不会变得疯狂?我希望能够说document.save()(顺便说一下,我使用的是Mongoose),然后让它在实际保存之后才返回

    编辑:添加代码

    这是从一个循环调用大约20000次。我不在乎(在合理范围内)它需要多长时间,但是200000个异步调用来保存会挂起脚本,所以它不会挂起(在这一点上,它还使用了超过1.5gig的ram)。如果我做不到hObj.save();等到对象被实际保存之后,我需要用一种更强大的语言来写这个

        models('hs').findOne({name: r2.$.name}, function (err, h) {
        if (err) {
            console.log(err);
        } else {
            var resultObj = createResult(meeting, r1, r2);
    
            if (h == undefined) {
    
                var hObj = new models('hs')({
                    name : r2.$.name,
                    results : [resultObj],
                    numResults : 1
                });
    
                hObj.save();
            } else {
                h.results.push(resultObj);
                h.numResults++;
                h.save();
            }
        }
    });
    
    从页面:

    eachSeries(arr、迭代器、回调)

    与每个相同,只有迭代器应用于arr中的每个项 系列下一个迭代器只有在当前迭代器完成后才被调用 完整的。这意味着迭代器函数将按顺序完成

    因此,假设在节点中有XML节点


    是的,但是如果有可用的库,您可能会重新考虑您的流程,这将允许您按顺序执行某些操作,而不是完全同步。如果你的问题中没有一些代码可以应用示例,那么这不是一个真正的答案。请尝试查找。此外,您可能会使用一些流式解决方案来读取XML,以便与它很好地集成。我确实看过async,但它似乎没有办法说“调用此函数,直到其回调执行后才返回”。我错了吗?你错了
    async.series
    async.parallelLimit
    async.eachLimit
    所有序列化执行。我想看看如何在上述代码中使用async.series使save()同步。我可能弄错了——他们的文档中没有很多简单的异步示例,只有一系列复杂的示例。谢谢,这是正确的。我最终使用了async.eachSeries()和async.series的组合,经过一些修改,一切都很好。我认为问题的一部分是我有太多的函数相互调用,以至于我不知道如何将最终保存链接回更高级别的forEach。
    async.eachSeries(
      nodes,
      // This will be applied to every node in nodes
      function (node, callback) {
        models('hs').findOne({name: r2.$.name}, function (err, h) {
          if (err) {
            console.log(err);
          } else {
            // Async?
            var resultObj = createResult(meeting, r1, r2);
    
            if (h == undefined) {
    
              var hObj = new models('hs')({
                name : r2.$.name,
                results : [resultObj],
                numResults : 1
              });
    
              hObj.save(function (err, p) {
                // Callback will tell async that you are done
                callback();
              });
            } else {
              h.results.push(resultObj);
              h.numResults++;
              h.save(function (err, p) {
                // Callback will tell async that you are done
                callback();
              });
            }
          }
        });
      },
      // This will be executed when all nodes has been processed
      function (err) {
        console.log('done!');
      }
    );