【问题标题】:mongoose - Executing a query for each array elementmongoose - 对每个数组元素执行查询
【发布时间】:2013-09-07 21:08:59
【问题描述】:

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

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

我想要一个数组,其中包含与键关联的值 ([value_associated_to_key1, ...])。

【问题讨论】:

    标签: javascript node.js mongodb mongoose


    【解决方案1】:

    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)。否则,您必须在之后将其与键数组进行比较,这可能效率低下(但仍比查询每个键更快)。

    【讨论】:

    • 谢谢。而且您不知道是否存在基于 Mongo 的解决方案(例如特殊要求)? PS:我认为findOne 方法更适合。否则将result.value 替换为result[0].value
    • 感谢指正。我刚刚意识到我太专注于如何对每个键进行查询,并没有考虑可以一次对所有键进行一次查询。我用一个例子更新了我的答案。
    猜你喜欢
    • 2014-05-21
    • 1970-01-01
    • 2019-08-09
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    • 1970-01-01
    • 2014-02-15
    • 1970-01-01
    相关资源
    最近更新 更多