2016-10-03 118 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,插入你想要的文档,并完全忘记游标迭代。 –