如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子句?
答案 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
}