MongoDB聚合查询按用户获取专属关联数据问题咨询
MongoDB聚合查询调整方案
现有语句核心问题
- 关联集合配置错误:你需要关联的是
Report报告表,现有语句错误关联了orders集合 - 关联逻辑缺失:
$lookup的let参数错误定义为固定字符串'id',没有获取当前用户的_id,且子查询中没有匹配报告表uid与用户ID的关联条件,导致返回全量关联数据 - 字段映射错误:用户表姓名字段为
displayName,现有$project中配置的name字段不存在,会返回空值 - 日期参数非法:2021年11月没有31日,
ISODate("2021-11-31")会触发日期格式报错
调整后完整查询语句
db.getCollection('users').aggregate([ { "$match": { brand: "Jollibee" } }, { $lookup: { from: "Report", // 若实际报告表集合名为全小写可改为report let: { userId: "$_id" }, pipeline: [ { $match: { $expr: { $eq: ["$uid", "$$userId"] }, date: { $gte: ISODate("2020-11-01"), $lt: ISODate("2021-12-01") } } } ], as: "reports", } }, { $project: { "_id": 1, "displayName": 1, "reports": 1 } } ])
关键调整说明
- 关联变量定义改为
{ userId: "$_id" },读取当前遍历用户的ID作为关联匹配变量 - 子查询增加
$expr匹配条件,仅筛选报告表uid字段等于当前用户ID的数据,实现每个用户仅拉取自身关联数据 - 修正日期范围为
$lt: ISODate("2021-12-01"),避免非法日期报错 - 修正
$project字段为用户表实际存在的displayName,保证返回值正常
内容的提问来源于stack exchange,提问作者Pinky Promise
相关产品推荐
相关产品推荐

