MongoDB按多个数组长度之和排序查询文档的方法
如何按MongoDB文档中
countries字段下所有数组的长度之和排序查询结果 问题场景
给定MongoDB集合中的文档结构如下:
{ "company": "abc", "countries": { "australia": ["banana", "kiwi", "avocado"], "germany": ["apple", "cucumber"], "columbia": ["banana"] } }
需要查询所有文档,并按照countries字段下所有数组的长度之和排序(示例中的长度总和为6)。不同文档的countries字段包含的键可能是子集(比如有的仅包含australia,有的包含germany和columbia)。
解决方案
使用MongoDB的聚合管道实现,核心是将countries对象转换为可遍历的数组,计算所有子数组的长度总和后排序:
db.collection.aggregate([ // 新增字段`totalFruits`,存储所有数组的长度之和 { $addFields: { totalFruits: { $sum: { $map: { input: { $objectToArray: "$countries" }, // 将`countries`对象转为键值对数组 as: "country", in: { $size: "$$country.v" } // 计算每个国家对应数组的长度 } } } } }, // 按`totalFruits`排序,-1为降序,1为升序 { $sort: { totalFruits: -1 } }, // 可选:如果不需要保留`totalFruits`字段,添加此步骤移除它 // { // $project: { totalFruits: 0 } // } ])
步骤解释
$objectToArray:将countries嵌套对象转换为[{k: "国家名", v: "对应数组"}, ...]格式的数组,方便后续遍历计算。$map:遍历转换后的数组,对每个元素的v(即对应国家的数组)使用$size获取长度,得到一个由所有数组长度组成的新数组。$sum:将$map生成的长度数组求和,得到所有数组的总长度,存入新增的totalFruits字段。$sort:根据totalFruits字段的值排序,-1表示降序排列,1表示升序排列。
这个方案可以适配countries字段包含任意键的情况,无论文档中的国家键是全集还是子集,都能正确计算总长度并排序。
内容的提问来源于stack exchange,提问作者Lucien Chardon
相关产品推荐
相关产品推荐

