MongoDB:获取Array的数量

时间:2010-07-02 23:20:56

标签: javascript mongodb

鉴于这些文件:

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} ]} );

我想得到Qty = 1(预期结果3)的所有OrderItem的计数。这是我认为编写查询的方式,但它返回2(每个订单文档为1):

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

如何查询Qty = 1的所有OrderItem的计数?

4 个答案:

答案 0 :(得分:4)

只是要明白其他人阅读这个帖子。

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

但是,OP需要计算数量为1的所有OrderItems。这里的问题是我们不计算文件。我们正在计算文档中数组中的项目。因此需要javascript和某种形式的特殊减少操作。

答案 1 :(得分:2)

您可以使用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;                                                                                            
  }                                                                                                       
});

答案 2 :(得分:0)

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

答案 3 :(得分:0)

这应该在没有JavaScript的shell中为你做(因此它会更快);

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

虽然不幸的是,如果这是一个常见的查询,那么您的数据结构就像那样。必须做$unwind是相对昂贵的。遗憾的是,您的订单商品并未作为标有订单ID的单独文档而不是包含订单商品数组的orderID文档进行布局......换句话说,与您所拥有的相反。这将更容易,更有效地处理。