MongoDB如何提取所有文档中的非空admins字段值列表?
解决方法
要提取所有非空admins字段中的元素并合并为一个列表,可以使用MongoDB的聚合管道或投影结合客户端处理来实现,具体方案如下:
方法一:聚合管道直接生成目标列表
通过聚合管道完成过滤、拆分数组、收集元素的全流程,直接得到合并后的列表:
db.data.aggregate([ // 过滤掉admins为空的文档 { $match: { admins: { $exists: true, $not: { $size: 0 } } } }, // 将每个文档的admins数组拆分为单个元素文档 { $unwind: "$admins" }, // 收集所有admins元素到一个数组($addToSet自动去重,无需去重则换用$push) { $group: { _id: null, allAdmins: { $addToSet: "$admins" } } }, // 仅保留目标数组字段,移除默认分组_id { $project: { _id: 0, allAdmins: 1 } } ])
执行后返回结果:
{ "allAdmins" : [ "adam", "ken", "rebecca" ] }
方法二:投影限制字段+客户端合并
如果场景简单,可以先通过投影只返回admins字段,再在客户端合并数组:
db.data.find( { admins: { $exists: true, $not: { $size: 0 } } }, { _id: 0, admins: 1 } )
这会返回各文档的admins数组:
{ "admins" : [ "adam", "ken" ] } { "admins" : [ "rebecca" ] }
后续在客户端(如Node.js、Python)用数组拼接方法(比如Array.prototype.concat)将这些数组合并为一个列表即可。
注意
你给出的预期结果中把adam误写为admin,实际执行上述语句会得到正确的adam元素。
内容的提问来源于stack exchange,提问作者hades
相关产品推荐
相关产品推荐

