我正在使用汇总查询来查找使用此查询的所有客户的所有订单
> 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
我怎样才能实现这一目标,帮助
答案 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