使用mongodb执行嵌套$ in查询

时间:2018-01-13 18:32:28

标签: mongodb

我正在尝试为伪SQL语句生成MongoDB版本3.6查询:

SELECT table1.c1, table1.c2 
FROM table1 
WHERE (table1.c1 IN (SELECT table2.c1 FROM table2 U0 WHERE (U0.c2 IN (1, 2))))

我该怎么做?我正在寻找单一的聚合查询语法。

修改

问题是this问题的副本。解释给出了假设查找阶段的输出数组将具有以下形式:

noncr = [{_id: ObjectID('xxxx'), blockedIDs: [ObjectID('yyy'), ObjectID('zzz')]}]

我正在查看的sql查询将具有$lookup的输出数组,如下所示:

table2 = [{_id: ObjectID('xxxx'), c1: 35}, 
          {_id: ObjectID('yyyy'), c1: 34}, 
          {_id: ObjectID('zzzz'), c1: 37}]

最后,数组需要转换为

table2 = [35, 34, 37]

所以它可以像这样使用:

$match: {$expr: {$in: [$c1, $table2]}}

基本上,我正在寻找一种转换table2的方法,如上所示。这可能吗?

1 个答案:

答案 0 :(得分:0)

我明白了。管道如下:

[{
    '$lookup': {
        'from': 'table2',
        'pipeline': [{
            '$match': {
                'c2': {
                    '$in': [1,
                    2]
                }
            }
        },
        {
            '$project': {
                'col1': True
            }
        }],
        'as': '_nested_in'
    }
},
{
    '$addFields': {
        '_nested_in': {
            '$map': {
                'input': '$_nested_in',
                'as': 'lookup_result',
                'in': '$$lookup_result.c1'
            }
        }
    }
},
{
    '$match': {
        '$expr': {
            '$in': ['$col1',
            '$_nested_in']
        }
    }
}

]

刚刚发现了$map运算符。