2016-10-03 2 views
1

Должен быть стандартный способ проверки наличия документа и затем вставки, если он не существует. Это то, что мы все делаем, с самого начала. Но примеры там показывают только наполовину рутину. Я не понимаю. Поэтому я придумал следующий код. И по какой-то причине выполняются как if, так и else. Функция не вызывается дважды, поэтому ... почему это происходит?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

, есть ограничение на 1 на курсоре, поэтому я могу понять, почему он не проверен, но да - зарегистрируйте размер курсора! – akaphenom

+1

Вы ищете * upsert * операцию ...? Это обновляет документ, если найденный else вставляет новый. – deceze

ответ

3

Имея if (doc != null) вы можете определить конец цикла. Они означают, что даже если вы ограничите результаты до 1, первая итерация вернет вам запрошенный документ, а во второй итерации курсор будет пустым и укажет, что это будет конец цикла/результатов.

Логи так:

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

потому, что вы выполняете асинхронную операцию в операторе еще.

Курсор не знает о вашем лимите в запросе.

+0

Приятно, я не знал, что (курсор не знает предела). Спасибо. Когда вы говорите «идентифицировать конец цикла», вы имеете в виду «break» из цикла? Или что-то другое? (Это говорит мне, что «невозможно определить цель для разрыва».) 'Return' также не имеет никакого эффекта; оба 'if' и' else' продолжают выполняться. – Bear

+2

Это означает, что для итерации других результатов нет. Например, этот запрос 'db.collection ('mycoll'). Find (mydoc) .limit (1);' не может дать вам никаких результатов или одного результата. В случае отсутствия результатов вы увидите «полученный документ» на консоли. В случае 1 результата вы увидите результат, который вы уже опубликовали. Я не уверен на 100%, чего вы хотите достичь, но я бы предложил использовать mongo findOne, а затем проверить, является ли doc var нулевым вставить требуемый документ и полностью забыть об итерации курсора. –

Смежные вопросы