MongoDB如何按指定字段分组并将其余字段聚合为嵌入式文档数组
MongoDB按指定字段分组并归集剩余字段到嵌入数组实现方案
直接使用MongoDB聚合管道的$group阶段即可完成需求,不需要额外在应用层做数据处理。
针对你给出的按owner字段分组、剩余字段归集到animals数组的场景,可直接执行以下聚合命令:
// 将your_collection_name替换为你实际的集合名称即可 db.your_collection_name.aggregate([ { $group: { _id: "$owner", owner: { $first: "$owner" }, animals: { $push: { pet: "$pet", pet_name: "$pet_name" } } } }, { // 移除聚合默认生成的_id临时分组键,匹配预期输出结构 $project: { _id: 0 } } ])
逻辑说明
- 分组规则:
$group阶段的_id字段设置为"$owner",即按owner字段值对全量文档做拆分分组 - 分组字段保留:同组内所有文档的
owner值完全一致,用$first取组内第一条文档的owner值作为结果的owner字段即可 - 剩余字段归集:通过
$push操作符遍历组内每一条文档,把需要保留的pet、pet_name拼成子文档,依次推入animals数组 - 结构调整:最后用
$project去掉聚合默认返回的_id字段,输出结构和预期完全对齐
执行上述命令后,返回结果和你给出的期望输出完全一致:
[ { "owner": "A", "animals": [ {"pet": "dog", "pet_name": "wouf"}, {"pet": "cat", "pet_name": "miaou"} ] }, { "owner": "B", "animals": [{"pet": "dog", "pet_name": "wouf_wouf"}] } ]
如果后续需要调整归集的字段范围,只需要修改$push内的字段映射配置即可,不需要改动其他管道逻辑。
内容的提问来源于stack exchange,提问作者Nazime Lakehal
相关产品推荐
相关产品推荐

