为什么在Mongo Aggregation查询中没有使用$ match?

时间:2017-04-24 11:40:24

标签: mongodb mongodb-query aggregation-framework

如mongo文档中所述: https://docs.mongodb.com/manual/reference/sql-aggregation-comparison/

查询以下SQL查询:

SELECT cust_id,
       SUM(li.qty) as qty
FROM orders o,
     order_lineitem li
WHERE li.order_id = o.id
GROUP BY cust_id

等效的mongo聚合查询如下:

db.orders.aggregate( [
   { $unwind: "$items" },
   {
     $group: {
        _id: "$cust_id",
        qty: { $sum: "$items.qty" }
     }
   }
] )

但是,查询工作正常,如预期的那样。我的问题,为什么SQL中相应的WHERE子句没有$ match子句? $ unwind如何补偿$ match子句?

1 个答案:

答案 0 :(得分:3)

@Veeram的评论是正确的。 SQL中的where子句是不必要的,因为items列表嵌入在orders集合中,在关系数据库中,您将拥有orders表和orders_lineitem表(取自https://docs.mongodb.com/manual/reference/sql-aggregation-comparison/处的描述的名称)

根据示例数据,您可以从以下文档开始:

{
  cust_id: "abc123",
  ord_date: ISODate("2012-11-02T17:04:11.102Z"),
  status: 'A',
  price: 50,
  items: [ { sku: "xxx", qty: 25, price: 1 },
           { sku: "yyy", qty: 25, price: 1 } ]
}

当你$unwind时,物品被解开但其余数据被投射。如果您运行像

这样的查询
db.orders.aggregate([ {"$unwind": "$items"} ])

你得到了输出

{
  cust_id: "abc123",
  ord_date: ISODate("2012-11-02T17:04:11.102Z"),
  status: 'A',
  price: 50,
  items: { sku: "xxx", qty: 25, price: 1 }
},
{
  cust_id: "abc123",
  ord_date: ISODate("2012-11-02T17:04:11.102Z"),
  status: 'A',
  price: 50,
  items: { sku: "yyy", qty: 25, price: 1 }
}

这会使items数组变平,允许$group添加items.qty字段:

db.orders.aggregate([ 
    {"$unwind": "$items"},
    {"$group": {
        "_id": "$cust_id",
        "qty": {"$sum": "$items.qty"}
       }
     }])

输出:

{ "_id": "abc123",
  "qty": 50
}