0

私は配列を持っていarray = [key1, key2, ..., keyn]ます。

私はスキーマを持っています: { key : String, value : String }.

キーに関連付けられた値を持つ配列を取得したいと思います ( [value_associated_to_key1, ...])。

4

1 に答える 1

4

非同期ライブラリは、このような状況に最適です。1 つの配列があり、それぞれの要素間に関係がある別の配列を作成したい場合は、通常 .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 を使用できます。

アップデート

もちろん、すべての値に対して 1 つのクエリを実行することもできます。

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

結果は値の配列になります。ただし、それらがキーと同じ順序であることは保証されません。キーがソートされている場合は、実行できます.find().sort({ key: 1 }).exec(callback)。そうしないと、後でキー配列と比較する必要があり、非効率になる可能性があります (ただし、各キーのクエリよりも高速です)。

于 2013-09-07T11:51:28.937 に答える