如何用PyMongo按名称查询文档并获取标签统计分析?
MongoDB按名称查询并统计标签的聚合实现
首先注意:你的文档里tags字段是逗号分隔的字符串(比如"tag1,tag2,tag3"),第一步得先把它拆成数组才能逐个统计。下面是完整的聚合管道操作:
db.collection.aggregate([ // 1. 过滤出指定name的文档 { $match: { name: "MyName" } }, // 2. 把逗号分隔的tags字符串拆成数组 { $addFields: { tagsArray: { $split: ["$tags", ","] } } }, // 3. 将数组展开,每个标签单独成一条文档 { $unwind: "$tagsArray" }, // 4. 按标签分组,统计出现次数 { $group: { _id: "$tagsArray", count: { $sum: 1 } } }, // 5. 把分组结果转成{标签名: 数量}的格式 { $group: { _id: null, tagStats: { $push: { k: "$_id", v: "$count" } } } }, { $replaceRoot: { newRoot: { $arrayToObject: "$tagStats" } } } ])
各阶段说明:
$match:精准筛选出name为目标值的所有文档,减少后续处理的数据量$addFields:用$split把tags字符串按逗号拆分,生成一个新的数组字段tagsArray$unwind:把数组里的每个标签单独拆成一条文档,这样才能对每个标签做统计- 第一个
$group:按标签内容分组,用$sum统计每个标签出现的总次数 - 第二个
$group:把所有标签的统计结果收集成一个数组,每个元素是包含k(标签名)和v(数量)的对象 $replaceRoot+$arrayToObject:把收集到的数组转成你需要的键值对格式,最终输出就是{tag1:7, tag2:5,...}这种结构
如果你的tags字段本来就是数组类型(不是逗号分隔的字符串),可以直接去掉$addFields阶段,把后面的$tagsArray换成$tags即可。
内容的提问来源于stack exchange,提问作者gjivanya
相关产品推荐
相关产品推荐

