MongoDB aggregate使用$filter时contactedNumberMessages返回null问题排查
问题原因
- 字段路径引用错误:你的文档中
contactedNumberMessages是嵌套在messaging.messages下的三级字段,你直接写$contactedNumberMessages会默认查找根级的contactedNumberMessages字段,而你的文档根层级根本不存在该字段,所以返回null。 - 过滤条件写反:你的需求是保留
direction为in的入站消息,但当前代码的筛选条件写的是匹配out的出站消息,和需求不符。 - 嵌套数组未正确遍历:
messaging和messages本身都是数组类型,你直接在$project里写嵌套结构没法自动遍历数组内的元素,需要配合$map操作符逐层处理数组元素。
修正后的聚合查询
Messages.aggregate([ { $match: { _id: mongoose.Types.ObjectId(id) // 如果入参id是字符串,需要先转成MongoDB ObjectId类型 } }, { $project: { messaging: { $map: { input: "$messaging", as: "msgItem", in: { ourNumber: "$$msgItem.ourNumber", messages: { $map: { input: "$$msgItem.messages", as: "contactMsg", in: { contact: "$$contactMsg.contact", contactedNumberMessages: { $filter: { input: "$$contactMsg.contactedNumberMessages", as: "message", cond: { $eq: ["$$message.direction", "in"] // 修正为筛选入站消息 } } } } } } } } } } } ])
额外注意事项
如果你的messaging数组和messages数组始终只有1个元素,也可以先用$unwind打平数组后再做过滤,写法会更简洁。
内容的提问来源于stack exchange,提问作者Brini M
相关产品推荐
相关产品推荐

