2016-10-03 11 views
1

文書の存在を確認し、存在しない場合は挿入する標準的な方法が必要です。これは時間の幕開け以来、私たち全員がやることです。しかし、そこにある例は、半分のルーチンしか示さない。理解できません。だから私は次のコードを思いついた。何らかの理由でifelseが実行されます。関数は2回呼び出されていないので、なぜそれが起こっているのですか?nodejs - IFとELSEの両方を実行する

出力は次のようになります。

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

コードです:

if (doc != null)を持つ
// 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

カーソルには1の制限がありますので、なぜチェックされていないのですか? – akaphenom

+1

* upsert *操作を探していますか?新しい文書が見つかった場合は、その文書を更新します。 – deceze

答えて

3

あなたは、ループの終了を識別することができます。つまり、結果を1に制限しても、最初の反復で照会した文書が返され、2回目の反復ではカーソルはNULLになり、ループ/結果の終わりであることが示されます。

ログはそのようなものです:

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

あなたが他の文で非同期操作を実行しているため。

カーソルはクエリの制限を認識しません。

+0

いいえ、私はそれを知りませんでした(カーソルは限界を意識していません)。ありがとうございました。あなたが「ループの終わりを特定する」と言うとき、ループから「中断する」という意味ですか?または、他の何か? (それは私に '休憩のために目標を決めることはできないと言っている。)' return'も効果がありません。 'if'と' else'の両方がまだ実行されています。 – Bear

+2

これは、反復する他の結果がないことを意味します。たとえば、このクエリ 'db.collection( 'mycoll')。find(mydoc).limit(1);'は結果も1つの結果も返しません。結果がない場合は、コンソールに 'got doc'が表示されます。結果が1の場合は、すでに投稿した出力が表示されます。私はあなたが達成したいことを100%確信していませんが、私はmongo findOneを使用し、doc varがnullであるかどうかを確認し、カーソルの反復について完全に忘れたい文書を挿入することをお勧めします。 –

関連する問題