私は配列を持っていarray = [key1, key2, ..., keyn]
ます。
私はスキーマを持っています: { key : String, value : String }
.
キーに関連付けられた値を持つ配列を取得したいと思います ( [value_associated_to_key1, ...]
)。
私は配列を持っていarray = [key1, key2, ..., keyn]
ます。
私はスキーマを持っています: { key : String, value : String }
.
キーに関連付けられた値を持つ配列を取得したいと思います ( [value_associated_to_key1, ...]
)。
非同期ライブラリは、このような状況に最適です。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)
。そうしないと、後でキー配列と比較する必要があり、非効率になる可能性があります (ただし、各キーのクエリよりも高速です)。