2015-01-03 3 views
0

Скажем, я хочу преобразовать массив с помощью функции карты, и каждое значение отображается в mongoDB с помощью findOne, критерии которого в свою очередь зависят от текущего значения из массива. Другими словами, просто преобразуйте массив идентификаторов в соответствующие объекты, извлеченные из БД. Как:Node.js: значения обратного вызова в зависимости друг от друга

arr.map(function(v) { 
      collection.findOne({_id: v}, function(
           ? 
      }); 

      return {newField: ?}; 
}); 

Вопросительные знаки являются места, которые должны быть заполнены, но я предполагаю, что вся структура должна быть изменена. Надеюсь, я поняла.

Я не привык к такому обратному мышлению и не могу обернуть вокруг себя голову, я пропустил что-то очевидное?

ответ

2

Вы можете использовать async библиотеку для выполнения асинхронных map, но в этот случай было бы проще и быстрее использовать оператор $in, чтобы MongoDB получить их все на одном дыхании:

collection.find({_id: {$in: arr}}).toArray(function(err, docs) { 
    // docs contains the docs with the _id values that were in arr 
}); 
+0

все нормально работает. Спасибо! – meliniak

+0

Btw, как вы называете это $ в операторе в JS? Знак $ как-то особенный? Или это просто произвольное имя mongoDB, и оно также может быть «в»? – meliniak

+1

Все операторы MongoDB начинаются с $. Но для JS это просто еще один персонаж. – JohnnyHK

0

Я не являюсь экспертом в MongoDB, но то, что вы можете сделать, это установить переменную перед collection линии, как это:

var return_element; var are_we_done = false; 
collection.findOne({_id: v}, function(
    // assign value to return_element 
    are_we_done = true; 
)}; 
while (!are_we_done) {} 
return {newField: <value of variable> }; 
+1

Я больше не эксперт в JS тоже, но я думаю, что путь return_element будут возвращены непосвященных, си Возврат nce мгновен, а обратный вызов - нет. – meliniak

+0

@meliniak Я добавил еще несколько кода, чтобы сделать его синхронным. – SalmonKiller

+1

спасибо за ваш вклад, но я уверен, что это плохая идея, поскольку он блокирует цикл событий, если цикл застревает, все запросы пользователей также блокируются. – meliniak

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