MongoDB聚合$unwind未按预期工作,仅返回单条记录
MongoDB $unwind仅返回数组最后一条记录的问题排查
我的MongoDB中存在如下数据:
{ "_id": { "$oid": "67d6dba348ee77f62b1527d3" }, "job_code": "ACC", "job_id": "73337", "partners": [ { "type": "Employee", "user_id": "132152" }, { "type": "Employee", "user_id": "130947" }, { "type": "Employee", "user_id": "132059" }, { "type": "Employee", "user_id": "131235" }, { "type": "Employee", "user_id": "131973" }, { "type": "Employee", "user_id": "65335" }, { "type": "Employee", "user_id": "101032" }, { "type": "Employee", "user_id": "36598" }, { "type": "Employee", "user_id": "94676" }, { "type": "Employee", "user_id": "124424" } ], "timestamp": { "$date": "2024-11-15T08:20:16.000Z" }, "user_id": "132059" }
但当我对partners字段使用$unwind时,结果仅返回数组最后一条记录(user_id为124424),而非预期的10条记录,求问题原因。
我使用的完整查询(依赖npm包@mongodb^6.4.0):
const res = await db .collection(targetCollection) .aggregate( [ { $match: { job_code: { $regex: `(^${jobCode}_)(LG[0-9]+|TG[0-9]+|LV[0-9]+|TV[0-9]+|L[0-9]+|T[0-9]+[^T00])$`, }, }, }, { $lookup: { from: "partners", let: { job_id: "$job_id", }, pipeline: [ { $match: { $expr: { $and: [ { $eq: ["$value.job_id", "$$job_id"], }, { $eq: ["$value.type", "Employee"], }, { $ne: ["$value.state", "deleted"], }, ], }, }, }, { $project: { _id: 0, type: "$value.type", user_id: "$value.user_id", }, }, ], as: "partners", }, }, { $unwind: "$partners", }, { $merge: sesColName, }, ], { allowDiskUse: true, } ) .toArray();
问题原因
你的聚合查询中,$lookup阶段的as: "partners"覆盖了原文档中同名的partners字段。你原本期望对原文档里包含10条数据的partners数组执行$unwind,但实际上经过$lookup后,partners字段已经被替换成从partners集合查询出来的结果数组。如果该$lookup的查询结果仅返回1条数据,那么$unwind后自然只会得到1条记录。
解决方案
- 修改
$lookup的as参数为其他名称,避免覆盖原字段,比如as: "related_partners",之后若需处理原partners数组可以继续使用原字段,处理查询结果则用新字段。 - 检查
$lookup的查询条件是否符合预期,确认partners集合中是否存在多条匹配value.job_id = "73337"、value.type = "Employee"且value.state != "deleted"的记录,调整查询逻辑确保返回预期的多条数据。
内容的提问来源于stack exchange,提问作者coldhands
相关产品推荐
相关产品推荐

