如何对猫鼬查询中返回的每个文档执行异步方法

科林·埃斯蒂斯(Collin Estes)

我设置了一个猫鼬模型架构,如下所示。

var orderSchema = new Schema ({
 _invoices: [{ type: Schema.ObjectId, ref: 'invoice'},
 _discounts: [{ type: Schema.ObjectId, ref: 'discount'},
 _client: String

});

orderSchema.methods.totalInvoiced = function (cb) {
 this.populate('_invoices', function (err, order) {
  cb(err, _.reduce(_.pluck(order._invoices, 'amount'), function (a, b) {
    return a+b;
     }, 0);
     }

};

orderSchema.methods.totalDiscount = function (cb) {
  this.populate('_discounts', function (err, order) {
  cb(err, _.reduce(_.pluck(order.discounts, 'amount'), function (a, b) {
    return a+b;
     }, 0);
     }

};

现在,我想获取一个订单集合,但我想将“ totalInvoiced”和“ totalDiscount”作为附加属性包括在返回的集合中的每个文档上。我了解这可能是“ totalInvoiced”成为虚拟财产的情况,但我并不总是希望将其包括在内。这是我尝试过的方法,但我觉得可能有更好的方法可以做到这一点。

Order.find({}, function (err, orders) {
     // for each order calc totals and add to document as two new properties
     _.each(orders, function (order) {
       async.parallel({
         invoice: function (cb) {
           order.totalInvoiced(cb);
         },
         discount: function (cb) {
           order.totalDiscount(cb);
         }
       }, function (err, result) {
        order.totalInvoiced = result.invoice;
        order.totalDiscount = result.discount;
       }

     });

     return orders;

    });

我的问题是,执行查询集合的最佳方法是什么,还要在每个文档上执行一些异步方法作为查询的一部分,还是通过迭代查询结果的正确方法来实现此目的?做这个。也许与查询流

斯图鲁德

_.each()不是异步的,因此当填充所有总数时,您将很难继续执行。另外,如果您无法控制Order.find()将要返回的订单数量,则可以通过不限制数量来限制总体数量,从而会遇到一些严重的性能问题。

您可以尝试如下操作:

Order.find({}, function (err, orders) {
    // populate max 15 orders at any time
    async.mapLimit(orders, 15, function (order, cb) {
        async.parallel({
            invoice: function (cb) {
                order.totalInvoiced(cb);
            },
            discount: function (cb) {
                order.totalDiscount(cb);
            }
        }, function (err, result) {
            order.totalInvoiced = result.invoice;
            order.totalDiscount = result.discount;
            return cb(null, order);
        });
    }, function (err, orders) {
        console.log('Done!');
    });
});

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在猫鼬查询方法中返回错误?

来自分类Dev

猫鼬:如何查询嵌套文档并返回String结果?

来自分类Dev

如何从猫鼬查询返回值

来自分类Dev

如何查询猫鼬的返回值

来自分类Dev

如何只返回在用猫鼬执行save()之后创建的文档

来自分类Dev

如何删除猫鼬中的子文档?

来自分类Dev

如何更新猫鼬文档中的值?

来自分类Dev

如何计算猫鼬查询返回的文档所使用的磁盘空间(字节)?

来自分类Dev

如何通过猫鼬查询返回嵌入式文档的过滤结果

来自分类Dev

如何通过查询子文档找到猫鼬文档?

来自分类Dev

如何通过查询子文档找到猫鼬文档?

来自分类Dev

猫鼬-对每个数组元素执行查询

来自分类Dev

按顺序执行猫鼬查询,然后先返回成功找到内容的猫鼬查询

来自分类Dev

查询猫鼬子文档

来自分类Dev

如何用猫鼬中另一个集合的文档填充文档的字段时查询文档?

来自分类Dev

如何在猫鼬中查询findOne(),以便获得满足特定条件的文档数组子集?

来自分类Dev

查询父级时如何获取猫鼬子文档数组中的聚合值总和?

来自分类Dev

查询猫鼬以执行连接

来自分类Dev

如何编写猫鼬查询来过滤子文档

来自分类Dev

查询猫鼬中数组字段条件的文档

来自分类Dev

猫鼬:如何使用.find()返回非Cursor文档

来自分类Dev

猫鼬:在数组中查找标签并返回匹配的文档

来自分类Dev

如何追踪猫鼬查询的执行时间

来自分类Dev

通过多种方法返回猫鼬查询结果

来自分类Dev

用过滤器查询子文档数组并用猫鼬返回原始文档

来自分类Dev

如何使用猫鼬将查询结果返回到变量

来自分类Dev

如何创建支持空值并返回全部的猫鼬查询

来自分类Dev

如何使用猫鼬将查询结果返回到变量

来自分类Dev

如何修复返回空数组的猫鼬查询

Related 相关文章

  1. 1

    如何在猫鼬查询方法中返回错误?

  2. 2

    猫鼬:如何查询嵌套文档并返回String结果?

  3. 3

    如何从猫鼬查询返回值

  4. 4

    如何查询猫鼬的返回值

  5. 5

    如何只返回在用猫鼬执行save()之后创建的文档

  6. 6

    如何删除猫鼬中的子文档?

  7. 7

    如何更新猫鼬文档中的值?

  8. 8

    如何计算猫鼬查询返回的文档所使用的磁盘空间(字节)?

  9. 9

    如何通过猫鼬查询返回嵌入式文档的过滤结果

  10. 10

    如何通过查询子文档找到猫鼬文档?

  11. 11

    如何通过查询子文档找到猫鼬文档?

  12. 12

    猫鼬-对每个数组元素执行查询

  13. 13

    按顺序执行猫鼬查询,然后先返回成功找到内容的猫鼬查询

  14. 14

    查询猫鼬子文档

  15. 15

    如何用猫鼬中另一个集合的文档填充文档的字段时查询文档?

  16. 16

    如何在猫鼬中查询findOne(),以便获得满足特定条件的文档数组子集?

  17. 17

    查询父级时如何获取猫鼬子文档数组中的聚合值总和?

  18. 18

    查询猫鼬以执行连接

  19. 19

    如何编写猫鼬查询来过滤子文档

  20. 20

    查询猫鼬中数组字段条件的文档

  21. 21

    猫鼬:如何使用.find()返回非Cursor文档

  22. 22

    猫鼬:在数组中查找标签并返回匹配的文档

  23. 23

    如何追踪猫鼬查询的执行时间

  24. 24

    通过多种方法返回猫鼬查询结果

  25. 25

    用过滤器查询子文档数组并用猫鼬返回原始文档

  26. 26

    如何使用猫鼬将查询结果返回到变量

  27. 27

    如何创建支持空值并返回全部的猫鼬查询

  28. 28

    如何使用猫鼬将查询结果返回到变量

  29. 29

    如何修复返回空数组的猫鼬查询

热门标签

归档