Mongodb 为什么在Mongo聚合查询中不使用$match?

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: "

如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: "$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。