簡體   English   中英

如何強制Mongoose Save()調用是同步的

[英]How can I force a Mongoose Save() call to be synchronous

我在Node.js中編寫一個腳本,需要執行以下操作:

  1. 打開XML文件
  2. 對於文件中的每個節點
  3. 執行mongodb查找以嘗試查找與此節點相關的對象
  4. 如果找不到對象,則創建它,否則以某種方式操作找到的對象
  5. 將(可能是新的)對象保存回數據庫。
  6. 轉到步驟2

我已經看了一段時間並得出結論,使用異步mongodb幾乎不可能做到這一點。 問題是多方面的,但是例如,如果您正在處理20,000個這樣的節點,那么執行異步將掛起腳本。 但是,由於步驟4需要查看對象是否已存在,因此將它們作為批量插入進行操作是不可行的。

有可能將一些可怕的東西拼湊在一起,緩存創建的對象,然后將它們保存為類似第7步的東西,除非它很難,因為對象進入了多個集合,你需要嘗試查找對象首先從緩存,然后是數據庫,在步驟4.如果這是解決方案,那么我將把Javascript注銷為破壞,並在perl中寫入。 所以我的問題是,對於像上面這些動作一樣簡單的事情,我能以某種方式強迫 mongodb同步,以便我的腳本不會變成瘋狂嗎? 我希望能夠說document.save()(順便說一下我使用的是Mongoose),然后讓它在實際保存后才返回。

編輯:添加代碼

這從循環中調用大約20000次。 我不關心(在合理范圍內)需要多長時間,但200,000異步調用保存會掛起腳本,因此不能那樣(它在那時也使用超過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();
        }
    }
});

異步github頁面:

eachSeries (arr,iterator,callback)

與每個相同,只有迭代器應用於arr中的每個項目。 只有當前的迭代器完成后才會調用下一個迭代器。 這意味着迭代器函數將按順序完成。

假設您在節點中擁有XML 節點

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!');
  }
);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM