MongoDB聚合查询:获取指定分支下邮箱非空的唯一客户信息
解决MongoDB聚合中无法获取customerEmail的问题
首先,咱们先看看你之前的聚合语句哪里出了问题:你的第一个$group阶段只按customerID分组,但没有保留customerEmail字段;后面的$addFields自然找不到这个字段,因为它已经在分组过程中丢失了,而且你多做了一次不必要的$group操作。
针对你的需求——获取指定分支下customerEmail非空的唯一customerID及对应邮箱,我们可以调整聚合管道如下:
db.collection.aggregate([ // 第一步:过滤出分支为CO且邮箱非空的文档 { $match: { branch: "CO", customerEmail: { $ne: "" } // 排除邮箱为空的无效记录 } }, // 第二步:按customerID分组,同时保留对应的邮箱(同一ID的邮箱一致,用$first/$last均可) { $group: { _id: "$customerID", customerEmail: { $first: "$customerEmail" } } }, // 第三步:重命名字段,整理成预期的输出格式 { $project: { _id: 0, // 去掉默认的_id字段 customerID: "$_id", customerEmail: 1 } } ])
各阶段作用说明:
- $match:先筛选出符合条件的文档,减少后续处理的数据量,同时提前排除邮箱为空的无效记录。
- $group:按
customerID分组去重,用$first获取该用户对应的邮箱(因为同一用户的邮箱在所有文档中都是相同的,用$last也能得到一致结果)。 - $project:重新整理输出字段,把分组用的
_id改成customerID,并移除默认的_id字段,让输出完全匹配你想要的格式。
运行这个聚合语句后,就能得到你预期的结果:
{"customerID" : "11396783", "customerEmail" : "foo@bar.com"} {"customerID" : "20103585", "customerEmail" : "xxx@yyy.com"}
内容的提问来源于stack exchange,提问作者azathoth
相关产品推荐
相关产品推荐

