在 MongoDB 聚合管道中 $lookup 返回空数组

时间:2021-06-01 10:46:12

标签: database mongodb aggregation-framework pymongo nosql-aggregation

我正在尝试对我的两个集合应用 $lookup 聚合,但它每次都返回一个空数组。我已经检查了本地和外国字段的数据类型,它们是相同的。我正在使用 pymongo 库在 Python 程序中实现它。

这是 paid 集合的架构:

{
"_id":{"$oid":"60aba58c5eff5afbc6e7c9f3"},
"created":{"$date":{"$numberLong":"1621861772297"}},
"questionId: {"$oid":"60aba53d485bfcf514e0bc1d"},
"userId":"gctqXxSIrAe8O8HidhOhxzYIDjR2"
}

这是 question 集合的架构:

{
"_id":{"$oid":"60ab8e0c485bfcf514e0bc18"},
"created":{"$date":{"$numberLong":"1621855756763"}},
"clientId":"ksCBoGLIr7MPNcod2FqXNPNcgZj2",
"topic":"Engineering"
}

现在我想使用 questionId 集合的 paid_id 集合的 question 加入这些集合,然后我可以按 userId 和 {{1 }} 并获取每个 userId 关注的每个主题的问题数

我以下列方式使用 topic

$lookup

这将返回一个空数组。我正在从 MongoDB Atlas 获取集合。
请有人帮助我,因为我对 Mongo 还很陌生,并且是第一次使用这些聚合函数。

1 个答案:

答案 0 :(得分:0)

这件事终于得到了解决。
我使用 collection1 = db['question]collection2 = db['paid'] 从 MongoDB Atlas 获取集合,然后使用查找为:

 pipeline = [{
       '$lookup':
         {
           'from': 'collection1',
           'localField': 'questionId',
           'foreignField': '_id',
           'as': 'output'
         }
 }]

records = list(collection2.aggregate(pipeline))

但是,我们必须在 from 子句中使用原始集合名称,而不是我们在从 Atlas 获取数据到 Python 后给出的名称。所以代码会变成:

pipeline = [{
           '$lookup':
             {
               'from': 'question',
               'localField': 'questionId',
               'foreignField': '_id',
               'as': 'output'
             }
     }]
    
records = list(collection2.aggregate(pipeline))

希望这能帮助那些在使用 Pymongo 和 MongoDB Atlas 时犯同样错误的人