鉴于这些文件:
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的计数?
答案 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文档进行布局......换句话说,与您所拥有的相反。这将更容易,更有效地处理。