mongoDB中的子查询问题

Posted

技术标签:

【中文标题】mongoDB中的子查询问题【英文标题】:Issue with subquery in mongoDB 【发布时间】:2019-02-25 17:44:43 【问题描述】:

我想用 MongoDB 做一个简单的子查询,但是,在阅读了大量文档之后,仍然不明白:( 我使用了类似的代码,但没有成功:https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/

select count(*) from Table1 where Field1 in (SELECT Field2 FROM Table2 where Field3 in ('QWERTY','ASDDF'));

你能帮忙吗? 谢谢。

已编辑: 我已经尝试过类似下面的方法,但仍然缺少...中的 field3 的过滤器

db.getCollection("Table1").aggregate(
    [
         
            "$group" : 
                "_id" : 

                , 
                "COUNT(*)" : 
                    "$sum" : NumberInt(1)
                
            
        , 
         
            "$project" : 
                "COUNT(*)" : "$COUNT(*)", 
                "_id" : NumberInt(0)
            
        ,
        
        "$lookup": 
            "from": "Table2",
            "localField": "Field1",
            "foreignField": "Field2" ,
            "as": "data"
            
        ,
"$match":  "data.Field3":  "$in" : [ "QWERTY", "ASDDF" ]     
    ], 
     
        "allowDiskUse" : true
    
);

【问题讨论】:

您能分享一下您尝试过但没有成功的例子吗? 嗨,Alex B,现已编辑 【参考方案1】:

如果我理解正确,您有两个这样的集合

collection1

[

    "c" : 3,
    "field" : 3
,

    "b" : 2,
    "field" : 2
,

    "a" : 1,
    "field" : 1

]

collection2

[

    "field1" : 4,
    "field2" : "kghjfdsa"
,

    "field1" : 3,
    "field2" : "dsfdgfdghdf"
,

    "field1" : 2,
    "field2" : "fdsfsd"
,

    "field1" : 1,
    "field2" : "adasd"

]

要查询您的数据,您只需要运行此查询

db.collection2.aggregate([
    
        $match: 
            field2: 
                $in: ["kghjfdsa", "fdsfsd", "adasd"]
            
        
    ,
    
        $lookup: 
            from: "collection1",
            localField: "field1",
            foreignField: "field",
            as: "data"
        
    ,
    
        $match: 
           "data.field": 1
         
    
])

如果我能提供其他帮助,请告诉我:)

【讨论】:

嗨@andranikasl,感谢您的回答。但是我已经尝试过了,它缺少foreignField“字段”的过滤器。想象一下,我只想要那些 field = 3 的那些。我一直在阅读提到的文档,我应该使用“let”和/或“pipeline”。 @PBR 你可以在查找后添加 $match: "data.field": 1 您好 Andranikasl,非常感谢您的回答。我很接近它,但仍然缺少一些东西。正如您在初始查询中所见: select count(*) from Table1 where Field1 in (SELECT Field2 FROM Table2 where Field3 in ('QWERTY','ASDDF')); field3 与我正在比较和查找的字段不同。还能用吗?

以上是关于mongoDB中的子查询问题的主要内容,如果未能解决你的问题,请参考以下文章

SELECT 中的子查询或 JOIN 中的子查询?

Mongodb检查数组的子文档中是否存在字段

SQL中的子查询

替换雪花中的子查询

Python中的子查询

Select查询Ms访问中的子查询