Mongodb 为什么在Mongo聚合查询中不使用$match?
如mongo文档中所述: 存在以下SQL查询的查询:Mongodb 为什么在Mongo聚合查询中不使用$match?,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,如mongo文档中所述: 存在以下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: "
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子句?@Veeram的评论是正确的。SQL中的
where
子句是不必要的,因为items
列表嵌入在orders集合中,在关系数据库中,您将同时拥有一个orders
表和一个orders\u lineitem
表(名称取自处的描述)
根据示例数据,您可以从以下文档开始:
{
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 }
}
已展平项目
数组,允许$group
添加项目。数量
字段:
db.orders.aggregate([
{"$unwind": "$items"},
{"$group": {
"_id": "$cust_id",
"qty": {"$sum": "$items.qty"}
}
}])
对于输出:
{ "_id": "abc123",
"qty": 50
}
@Veeram的评论是正确的。SQL中的
where
子句是不必要的,因为items
列表嵌入在orders集合中,在关系数据库中,您将同时拥有一个orders
表和一个orders\u lineitem
表(名称取自处的描述)
根据示例数据,您可以从以下文档开始:
{
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 }
}
已展平项目
数组,允许$group
添加项目。数量
字段:
db.orders.aggregate([
{"$unwind": "$items"},
{"$group": {
"_id": "$cust_id",
"qty": {"$sum": "$items.qty"}
}
}])
对于输出:
{ "_id": "abc123",
"qty": 50
}
您的模式已经处理了
中的li.order\u id=o.id
,因为现在$items
是order文档中的嵌入文档。因此,当您将订单文档与订单项一起保存时,将建立这种关系。您可以$unwind
将$items
和$group
计算其字段的$sum
;所呈现的sql查询具有误导性,因为WHERE子句实际上应该是一个ON子句,作为两个sql表之间联接的一部分。一旦你意识到只有一个连接,而没有真正的WHERE子句,这就解释了为什么你不需要一个等价的$match。你的模式已经考虑了其中li.order\u id=o.id
,因为现在$items
是order文档中的一个嵌入文档。因此,当您将订单文档与订单项一起保存时,将建立这种关系。您可以$unwind
将$items
和$group
计算其字段的$sum
;所呈现的sql查询具有误导性,因为WHERE子句实际上应该是一个ON子句,作为两个sql表之间联接的一部分。一旦你意识到只有一个join,而没有真正的WHERE子句,这就解释了为什么你不需要一个等价的$match。