mongoose - 为每个数组元素执行查询

时间:2013-09-07 11:00:36

标签: javascript node.js mongodb mongoose

我有一个数组array = [key1, key2, ..., keyn]

我有一个架构:{ key : String, value : String }

我想获得一个包含与键([value_associated_to_key1, ...])相关联的值的数组。

1 个答案:

答案 0 :(得分: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。

<强>更新

当然也可以对所有值进行一次查询:

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

结果现在是一组值。但是,它不能保证它们与按键的顺序相同。如果密钥已排序,则可以.find().sort({ key: 1 }).exec(callback)。否则,您必须将其与密钥数组进行比较,这可能效率低(但仍然比每个密钥的查询更快)。