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']}
。
我正在使用 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']}
。