繁体   English   中英

MongoDB:获取数组计数

[英]MongoDB: Get count of Array

鉴于这些文件:

db.orders.insert( {OrderId:1, OrderItems: [{OrderItemId:1, Qty:1}, {OrderItemId:2, Qty:1} ]} );
db.orders.insert( {OrderId:2, OrderItems: [{OrderItemId:1, Qty:1}, {OrderItemId:2, Qty:2} ]} );

我想获取数量= 1(预期结果3)的所有OrderItems的计数。 我就是这样写查询的,但是它返回2(每个Order文档为1):

db.orders.find({"OrderItems.Qty":1}).count();

如何查询以找到数量= 1的所有OrderItem的计数?

只是为了让其他阅读此线程的人清楚。

OP的命令db.orders.find({"OrderItems.Qty":1}).count(); 基本上是计算任何订购项目的数量为1的单据数量。

但是,OP希望对数量为1的所有OrderItem进行计数。 这里的问题是我们没有计算文档。 我们正在计算文档中数组中的项目。 因此需要javascript和某种形式的特殊reduce操作。

您可以使用JavaScript:

db.orders.group(
{
  key: null, 
  cond: {'OrderItems.Qty':1}, 
  initial: {count: 0}, 
  reduce: function(el, running)
  {                                                                                                       
    running.count += el.OrderItems.filter(function(el)                                                    
    {                                                                                                     
      return el.Qty == 1;                                                                                 
    }).length;                                                                                            
  }                                                                                                       
});
db.orders.aggregate([
  {$unwind: '@OrderItems'},
  {$match : {'OrderItems.Qty':1}},
  {$group : { _id : null, 'countOfQty1':{$sum:'$OrderItems.Qty'} }}
]);

这应该在没有JavaScript的shell中为您完成(这样会更快);

db.orders.aggregate([
  {$unwind:'$OrderItems'},
  {$match: {'OrderItems.Qty':1}},
  {$group : { 
      _id : "Qty1",
      sum: {$sum:1}
  }}
]);

虽然很遗憾,但是如果这是常见查询,则数据的结构是这样的。 必须进行$unwind相对昂贵。 遗憾的是,您的订单项没有作为带有订单ID标记的单独文档而不是包含订单项数组的orderID文档进行布局……换句话说,就是您所拥有的相反。 这将更容易且更有效地处理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM