pymongo 与 $lookup 和管道聚合

pymongo aggregate with $lookup and pipeline

我正在使用 python3, pymongo, mongodb4.4.3

我有两个合集:

assignments: user_id,qid
questions: qid,text,category

当我根据 qid 将它们加入一个查询时,它看起来像这样:

aggregate = [
        {
            '$match': {
                'user_id': user_id
            }
        },
        {
            '$lookup': {
                'from': 'questions',
                'localField': 'qid',
                'foreignField': 'qid',
                'as': 'question'
            }
        }
    ]
result = col_assignments.aggregate(aggregate)

而且效果很好。

但现在我需要根据 'questions' 集合中的 'category' 字段进行过滤。

互联网说我需要使用 pipeline$expr 而不是本地和外部字段。所以我做了这样的查询:

aggregate = [
        {
            '$match': {
                'user_id': user_id
            }
        },
        {
            '$lookup': {
                'from': 'questions',
                'let': { 'qid': '$qid' },
                'pipeline': [{ 
                    '$match': { 
                        '$expr': {'$eq': ['$$qid', 'qid']},
                        'category': current_category
                    }
                }],
                'as': 'question'
            }
        }
    ]

而且它不起作用,'question' 是空的。

我猜这与语法有关。但是我从来没有在 mongo shell 和 pymongo 中使用过如此复杂的查询。你能帮我吗?

如果要根据相应的问题类别过滤掉整个assignment项目,则不应在类别中定义条件$lookup聚合阶段。而是使用另一个单独的 $match 阶段。

aggregate = [
        {
            '$match': {
                'user_id': user_id
            }
        },
        {
            '$lookup': {
                'from': 'questions',
                'localField': 'qid',
                'foreignField': 'qid',
                'as': 'question'
            }
        },
        {
            '$match': {
                'question.0.category': current_category
            }
        }
])

如果您只想过滤掉相应的问题类别,只需按照的建议添加缺失的$'$expr': {'$eq': ['$$qid', '$qid']}