Mongodb聚合查询特定记录而不是集合

时间:2016-02-11 11:49:11

标签: mongodb aggregation-framework

我正在使用汇总查询来查找使用此查询的所有客户的所有订单

> db.orders.aggregate([{ "$group":{ "_id":"$customer", "orders":{ "$sum": 1 }}}])
{ "_id" : "b", "orders" : 2 }
{ "_id" : "a", "orders" : 3 }

但现在不是在所有订单记录上运行此查询,而只是想在特定订单集上运行它,该订单由此查询返回

   db.delivery.find({"status":"DELIVERED"},{order:1}).pretty() ,

给了我

{ "order" : ObjectId("551c5381e4b0df29878547e1") } 
{ "order" : ObjectId("551c8f8ae4b0ab335af6ab91") } 
{ "order" : ObjectId("551ca7ede4b0ab335af6ab95") } 
{ "order" : ObjectId("551cb00fe4b0ab335af6ab98") } 
{ "order" : ObjectId("551cbe20e4b0df29878547ed") }
....and few more records

我怎样才能实现这一目标,帮助

1 个答案:

答案 0 :(得分:2)

使用 $match 运算符过滤进入管道的文档。

使用 {{3>获取订单ID列表(在 $match 管道中使用 $in 光标 find() 方法:

var orderIds = db.delivery.find({"status": "DELIVERED"}).map(function(d){return d.order;});
db.orders.aggregate([
    { "$match": { "_id": { "$in": orderIds } } },
    { "$group": { "_id": "$customer", "orders": { "$sum": 1 } } }
])

对于MongoDB 3.2,使用 map() 运算符,该运算符对同一数据库中的未整数集合执行左外连接,以过滤来自"加入"的文档。收集处理。

以下示例显示了如何使用orders字段orders加载来自delivery的文档以及来自order集合的文档的delivery集合上运行聚合操作来自db.orders.aggregate([ { "$lookup": { "from": "delivery", "localField": "_id", "foreignField": "order", "as": "delivery_orders" } }, { "$match": { "delivery_orders.status": "DELIVERED" } }, { "$group": { "_id": "$customer", "orders": { "$sum": 1 } } } ]) 集合:

arg1