限制MongoDB聚合$lookup只匹配一次

6
有两个集合,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个回答

7

您可以尝试在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
 }}
])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接