我正在编写一个需要在两个表之间进行 $lookup 的查询,据我了解,foreignField 必须有一个索引才能及时执行此连接。但是,即使在字段上添加索引后,查询仍会退回到 COLLSCAN。
db.users.aggregate([
{$lookup:{ from: "transactions", localField: '_id', foreignField: 'uid', as: 'transaction' }},
{ $match: { transaction: { "$size" : 0} } },
{ $count: "total"},
], { explain: true })
这将返回:
"queryPlanner" : {
"plannerVersion" : 1,
"namespace" : "test.users",
"indexFilterSet" : false,
"parsedQuery" : {
},
"winningPlan" : {
"stage" : "COLLSCAN",
"direction" : "forward"
},
"rejectedPlans" : [ ]
}
正如我所提到的,我确实在 transactions 集合中索引了uid字段:
> db.transactions.getIndexes()
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "test.transactions"
},
{
"v" : 1,
"key" : {
"uid" : 1
},
"name" : "uid_1",
"ns" : "test.transactions"
}
]
该查询需要几分钟才能在大约 7M 文档的数据库中运行。我正在使用 MongoDB v3.4.7。关于我可能做错了什么的任何想法?提前致谢!