2013-09-07 6 views

ответ

3

async library идеально подходит для этих ситуаций. Когда у вас есть один массив и вы хотите, чтобы он привел к другому массиву, где есть некоторая связь между соответствующими элементами, обычно используется .map.

var async = require('async'); 

async.map(array, function (key, next) { 
    // Do a query for each key 
    model.findOne({ key: key }, function (err, result) { 
    // Map the value to the key 
    next(err, result.value); 
    }); 
}, 
function (err, result) { 
    console.log(result); // [value1, value 2, ...] 
}); 

Если у вас есть много ключей, async.map может перегрузить синус сервера он вызывает каждый запрос параллельно. Если это так, вы можете использовать async.eachSeries.

Update

Конечно, это также возможно сделать один запрос для всех значений:

model.find({ key: { $in: array } }, function (err, result) { 
    result = result.map(function (document) { 
    return document.value; 
    }); 
}); 

В результате теперь массив значений. Однако это не гарантирует, что они находятся в том же порядке, что и ключи. Если ключи отсортированы, можно сделать .find().sort({ key: 1 }).exec(callback). В противном случае вам придется сравнивать его с массивом ключей впоследствии, что может быть неэффективным (но все же быстрее, чем запрос для каждого ключа).

+0

Спасибо. И разве вы не знаете, существует ли монгольское решение (например, специальный запрос)? PS: 'findOne' метод более адаптирован Я думаю. Else замените 'result.value' на' result [0] .value'. – Lithy

+0

Спасибо за исправление. Я просто понял, что слишком сосредоточен на том, как делать запрос для каждого, и не думал, что можно сделать один запрос для всех ключей одновременно. Я обновил свой ответ на примере. –

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