有两个集合,users
和reports
。
我的目标是制作一个聚合,让所有用户和每个user
包含用户最后 report
的数量。
这是我目前的聚合:
db.users.aggregate([{
$lookup: {
from: 'reports',
localField: '_id',
foreignField: 'userId',
as: 'report',
},
}, {
$project: {
'lastReportAmount': {
$let: {
vars: {
lastReport: {'$arrayElemAt': ['$report', 0]},
},
in: '$$lastReport.amount',
},
},
'id': '$_id',
'name': 1,
'firstLogin': 1,
'email': 1,
},
}])
这个查询工作正常,但速度很慢
这样做的原因是$lookup
会返回与某个userId
匹配的所有报告,而不是一个(最后一个)。
有没有办法将$lookup
限制为只有一个匹配?
答案 0 :(得分:2)
您可以尝试3.6中提供的新查找变体。
在报告集合中的userId和date字段中添加索引,并查看它是否被拾取。
db.users.aggregate([
{"$lookup":{
"from": "reports",
"let": {"_id":"$_id"},
"pipeline":[
{"$match":{"$expr":{"$eq":["$$_id","$userId"]}}},
{"$sort":{"date": -1}},
{"$limit":1}
],
"as": "lookup-latest"
}},
{"$project": {
'lastReportAmount':{'$arrayElemAt':['$lookup-latest', 0]},
'id': '$_id',
'name': 1,
'firstLogin': 1,
'email': 1
}}
])