【问题标题】:mongodb aggregate with $group and $lookupmongodb 与 $group 和 $lookup 聚合
【发布时间】:2016-08-23 03:01:53
【问题描述】:

我正在尝试对一个表执行“分组依据”并将其与另一个表“加入”。 对应的 SQL 语句为:

SELECT T1.total, T1.email, T1.type, table_2.name FROM
(SELECT SUM(amount) AS total, email, type 
FROM table_1
GROUP BY email, type) T1
INNER JOIN table_2
on T1.email = table_2.email 

但由于 mongodb 仍然没有内部连接功能,我尝试使用“$lookup”来完成任务。这是我的代码:

db.table_1.aggregate([
{$group : {_id : {email: "$email", type:"$type"},total: { $sum: "$amount" }}},
{$lookup: {from: "table_2", localField: "email", foreignField: "email", as: "details"}} ]);

但在我得到的结果中,详细信息返回和空对象:

{ "_id" : { "user" : "b@b.com", "type" : "Car" }, "total" : 2, "details" : [ ] }
{ "_id" : { "user" : "a@a.com", "type" : "Bike" }, "total" : 3, "details" : [ ] }
{ "_id" : { "user" : "a@a.com", "type" : "Car" }, "total" : 1, "details" : [ ] }

但如果我在不使用 $group 的情况下运行查询,它就可以正常工作。所以我想知道 $group 和 $lookup 函数是否不能一起使用。如果是这样,是否有解决方法或完成查询的最佳方法是什么?

[我正在使用的mongo db版本:> db.version() 3.2.7]

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:

    我找到了问题的答案。我得到空数组的原因是我在 $lookup 中使用 localField 的方式。

    由于我正在尝试将 table_2 与 table_1 的 $group 结果连接起来,因此本地字段应该是“_id.email”。

    所以工作查询将是:

    db.table_1.aggregate([
        {$group : {_id : {email: "$email", type:"$type"},total: { $sum: "$amount" }}},
        {$lookup: {from: "table_2", localField: "_id.email", foreignField: "email", as: "details"}},
        {$match: {details: {$ne: []}}}
    ]);
    

    感谢@Wake 和@Clement 的帮助

    【讨论】:

    • 有道理。我没有意识到你得到了应该匹配的电子邮件地址的空数组。
    • 为什么$match阶段的顺序在聚合的最后?
    【解决方案2】:

    如果您希望您的 $lookup 像 INNER JOIN 一样工作,也就是说,除非查找中至少有一个匹配的文档,否则您不需要结果表,您可以在末尾添加一个 $match,将您的查找表结果与一个空数组进行比较 [ ]:

    db.table_1.aggregate([
        {$group : {_id : {email: "$email", type:"$type"},total: { $sum: "$amount" }}},
        {$lookup: {from: "table_2", localField: "email", foreignField: "email", as: "details"}},
        {$match: {details: {$ne: []}}}
    ]);
    

    【讨论】:

      【解决方案3】:

      从 Mongo 3.2 版开始,$lookup 用于支持左外连接。

      我想知道 $group 和 $lookup 函数是否不能使用 在一起。

      $group 和 $lookup 可以一起使用。

      如何将其用于 INNER JOIN

      您又添加了一个条件来过滤结果。使用 $match。 您也可以尝试使用 $in。

      参考文献

      https://www.mongodb.com/blog/post/joins-and-other-aggregation-enhancements-coming-in-mongodb-3-2-part-1-of-3-introduction

      http://www.clusterdb.com/mongodb/joins-and-other-aggregation-enhancements-in-mongodb-3-2

      https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/

      https://docs.mongodb.com/manual/reference/operator/aggregation/match/

      【讨论】:

        猜你喜欢
        • 2017-10-08
        • 2019-09-03
        • 2020-10-05
        • 2019-01-21
        • 2020-04-03
        • 1970-01-01
        • 2019-10-25
        • 2021-04-11
        • 2022-01-05
        相关资源
        最近更新 更多