将MongoDB聚合$ lookup限制为仅匹配1

时间:2018-03-22 12:45:05

标签: mongodb

有两个集合,usersreports

我的目标是制作一个聚合,让所有用户和每个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限制为只有一个匹配?

1 个答案:

答案 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
 }}
])
相关问题