首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多个字段上的mongoDB连接

问多个字段上的mongoDB连接
EN

Stack Overflow用户
提问于 2016-07-06 21:13:47
回答 2查看 12K关注 0票数 2

我正在将SQL查询重写为mongoDB。有人可以帮助我们如何像下面的SQL查询那样用多个连接键和条件连接两个集合吗?

代码语言:javascript
复制
SELECT S.* FROM LeftTable S
LEFT JOIN RightTable R ON S.ID =R.ID AND S.MID =R.MID WHERE R.TIM >0 AND S.MOB IS NOT NULL

我有下面的代码,它与单连接关键字条件。如果有人能用多个连接键和where子句来完成查询,我会很高兴的。

代码语言:javascript
复制
db.dim.aggregate([{$lookup:{from:"dimFactsVer11",localField:"Sub", foreignField:"Type", as:"EmbedUp"}}])
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-10-24 17:53:44

目前mongodb $lookup只比较单个本地和外部密钥。

但是,如果你想像mysql left join那样使用两个或更多的文件来执行查询,那么下面就是解决方案。

代码语言:javascript
复制
db.getCollection('LeftTable').aggregate([
{
    $lookup:
        {
          from: "RightTable",
          localField: "ID",
          foreignField: "ID",
          as: "RightTableData"
        }
},  
{$unwind :"$RightTableData" },
{ 
     $project: { 
            mid: { $cond: [ { $eq: [ '$MID', '$RightTableData.MID' ] }, 1, 0 ] } 
        } 
},
{$match : { mid : 1}}

])

这里的$MID是LeftTable中场。

票数 4
EN

Stack Overflow用户

发布于 2017-04-19 02:46:29

通过正确组合$lookup、$project和$match,您可以在参数上连接多个表。这是因为它们可以被链接多次。

第1步:链接所有表

$lookup -查询中的每个表一个

$unwind -因为数据被正确地反规范化,否则包装在数组中

Python代码..

代码语言:javascript
复制
db.LeftTable.aggregate([
                        # connect all tables

                        {"$lookup": {
                          "from": "RightTable",
                          "localField": "ID",
                          "foreignField": "ID",
                          "as": "R"
                        }},
                        {"$unwind": "R"}

                       # {"$lookup": {
                       #   "from": "TopTable",
                       #   "localField": "ID",
                       #   "foreignField": "ID",
                       #   "as": "T"
                       # }},
                       # {"$unwind": "T"},

                        ])

第2步:定义所有条件

$project:在这里定义所有条件语句,以及您想要选择的所有变量。

Python代码..

代码语言:javascript
复制
db.LeftTable.aggregate([
                        # connect all tables

                        {"$lookup": {
                          "from": "RightTable",
                          "localField": "ID",
                          "foreignField": "ID",
                          "as": "R"
                        }},
                        {"$unwind": "R"},

                       # {"$lookup": {
                       #   "from": "TopTable",
                       #   "localField": "ID",
                       #   "foreignField": "ID",
                       #   "as": "T"
                       # }},
                       # {"$unwind": "T"},

                        # define conditionals + variables

                        {"$project": {
                          "midEq": {"$eq": ["$MID", "$R.MID"]},
                         # "midGt": {"$gt": ["$MID", "$T.MID"]},
                          "ID": 1, "MOB": 1, "MID": 1
                        }}
                        ])

第3步:加入所有条件句

$match -使用OR或AND等连接所有条件。这些条件可以有多个。

$project:取消定义所有条件

Python代码..

代码语言:javascript
复制
db.LeftTable.aggregate([
                        # connect all tables

                        {"$lookup": {
                          "from": "RightTable",
                          "localField": "ID",
                          "foreignField": "ID",
                          "as": "R"
                        }},
                        {"$unwind": "$R"},

                       # {"$lookup": {
                        #  "from": "TopTable",
                        #  "localField": "ID",
                        #  "foreignField": "ID",
                        #  "as": "T"
                        #}},
                        #{"$unwind": "$T"},

                        # define conditionals + variables

                        {"$project": {
                          "midEq": {"$eq": ["$MID", "$R.MID"]},
                          # "midGt": {"$gt": ["$MID", "$T.MID"]},
                          "ID": 1, "MOB": 1, "MID": 1
                        }},

                        # join all conditionals

                        {"$match": {
                          "$and": [
                            {"R.TIM": {"$gt": 0}}, 
                            {"MOB": {"$exists": True}},
                            {"midEq": {"$eq": True}},]
                        }},

                        # undefine conditionals

                        {"$project": {
                          "midEq": 0,
                          # "midGt": 0
                        }}

                        ])

几乎任何表、条件和连接的组合都可以用这种方式完成。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38224981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档