2016-10-03 37 views
1

必須有一個檢查文檔存在的標準方法,然後插入(如果不存在)。這是我們大家都做的事情,從時間的黎明開始。但是那裏的例子只顯示了一半的例程。我不明白。所以我想出了以下代碼。由於某種原因,執行ifelse。該函數沒有被調用兩次,所以...爲什麼會發生?nodejs - IF和ELSE都執行

輸出是:

Connected correctly to server 
got doc 
inserted doc 
Disconnected from server successfully 

的代碼是:

// Use connect method to connect to the Server 
mongoClient.connect(url, function (err, db) { 
    assert.equal(null, err); 
    console.log("Connected correctly to server"); 

    var cursor = db.collection('mycoll').find(mydoc).limit(1); 
    // i need 'each' in order to test if doc exists. 
    // will execute once because i said limit 1. 
    cursor.each(function (err, doc) { 
     if (doc != null) { 
      console.log("got doc"); 
     } 
     else { 
      mydoc.date_submit = new Date(); 
      db.collection('mycoll').insertOne(mydoc, function (err, r) { 
       assert.equal(1, r.insertedCount); 
       console.log("inserted doc"); 
       db.close(); 
       console.log('Disconnected from server successfully'); 
      }); 
     } 
    }); 
}); 
+0

也許你應該記錄光標的大小 –

+1

光標上有一個限制,所以我可以理解它爲什麼不被選中,但是 - 是的 - 記錄光標的大小! – akaphenom

+1

你正在尋找* upsert *操作...?如果找到,則更新文檔,否則插入新文檔。 – deceze

回答

3

具有if (doc != null)可以識別循環的結束。這意味着即使將結果限制爲1,第一次迭代也會將您查詢的文檔返回給您,並且在第二次迭代中游標將爲空,並指示這應該是循環/結果的結尾。

日誌是這樣的:

Connected correctly to server 
got doc 
inserted doc 
Disconnected from server successfully 

,因爲你是在else語句執行的異步操作。

光標不知道您在查詢中的限制。

+0

不錯,我不知道(光標不知道限制)。謝謝。當你說'識別循環的結尾'時,你的意思是'斷開'循環嗎?或者是其他東西? (它告訴我'不能確定break'的目標。)'return'也沒有效果, 'if'和'else'仍然執行。 – Bear

+2

這意味着沒有其他結果要迭代。例如,這個查詢'db.collection('mycoll')。find(mydoc).limit(1);'可以給你沒有結果或一個結果。在沒有結果的情況下,您會在控制檯中看到「獲得的文檔」。在1個結果的情況下,您將看到您已經發布的輸出。我不是100%確定你想達到什麼,但我會建議使用mongo findOne,然後檢查文檔var是否爲null,插入你想要的文檔,並完全忘記遊標迭代。 –