【问题标题】:Performing nested $in query using mongodb使用 mongodb 执行嵌套 $in 查询
【发布时间】:2018-06-22 21:45:27
【问题描述】:

我正在尝试为伪 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}]

最后需要将数组转换为just

table2 = [35, 34, 37]

所以可以这样使用:

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

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

【问题讨论】:

标签: mongodb


【解决方案1】:

我想通了。流水线如下:

[{
    '$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 运算符。

【讨论】:

  • 这里不需要$map。您可以替换 { '$match': { '$expr': { '$in': ['$col1', '$_nested_in.c1'] } } } 此外,$in 的参数不正确。第一个参数应该是值而不是数组。我已经添加了答案。
猜你喜欢
  • 2013-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-07
  • 2011-03-08
  • 2021-06-20
  • 2015-05-20
  • 1970-01-01
相关资源
最近更新 更多