Javascript MongoDB:获取数组的计数

Javascript MongoDB:获取数组的计数,javascript,mongodb,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} ]} ); 我想获得数量=1(预期结果3)的所有OrderItem的计数。我认为这是编写查询的方式,但它返回2

鉴于这些文件:

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)的所有OrderItem的计数。我认为这是编写查询的方式,但它返回2(每个订单文档返回1):


如何查询数量为1的所有订单项的计数?

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

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

只是为了让其他阅读本文的人明白

OP的命令
db.orders.find({“OrderItems.Qty”:1}).count()基本上统计任何订单项数量为1的文档数


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

为了让其他阅读此帖子的人明白

db.orders.aggregate([
  {$unwind: '@OrderItems'},
  {$match : {'OrderItems.Qty':1}},
  {$group : { _id : null, 'countOfQty1':{$sum:'$OrderItems.Qty'} }}
]);
OP的命令
db.orders.find({“OrderItems.Qty”:1}).count()基本上统计任何订单项数量为1的文档数


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

这应该可以在没有JavaScript的shell中为您实现(因此速度会快得多)

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

虽然不幸的是,如果这是一个常见的查询,那么您的数据的结构就是这样的。必须做
$unwind
相对来说比较昂贵。令人遗憾的是,您的订单项没有作为带有订单ID的单独文档而不是包含订单项数组的订单ID文档进行布局……换句话说,与您拥有的相反。这将更容易、更高效地进行处理。

这将在没有JavaScript的shell中为您完成这项工作(因此会更快)


虽然不幸的是,如果这是一个常见的查询,那么您的数据的结构就是这样的。必须做
$unwind
相对来说比较昂贵。令人遗憾的是,您的订单项没有作为带有订单ID的单独文档而不是包含订单项数组的订单ID文档进行布局……换句话说,与您拥有的相反。这将更容易、更高效地处理。

您能帮助我了解Mongo shell内部使用的语法吗?(mongo.exe)您能帮我了解一下mongo shell内部使用的语法吗?(mongo.exe)现在是社区维基。如果你认为它不对,你可以适当地修改它。它现在是社区维基。如果你认为它不对,你可以适当地改变它。这更像是一个评论或回答吗?我不认为这是一个答案,但这可能是因为我不熟悉代码,但我相信这个答案被标记是有原因的。不,这显然不是答案,而是对问题和其他答案的评论。也没有“线索”,只有问题和答案。这应该是对问题的评论。这更像是评论还是回答?我不认为这是一个答案,但这可能是因为我不熟悉代码,但我相信这个答案被标记是有原因的。不,这显然不是答案,而是对问题和其他答案的评论。也没有“线索”,只有问题和答案。这应该是对这个问题的评论。