You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 }
  // }
])

步骤解释

  1. $objectToArray:将countries嵌套对象转换为[{k: "国家名", v: "对应数组"}, ...]格式的数组,方便后续遍历计算。
  2. $map:遍历转换后的数组,对每个元素的v(即对应国家的数组)使用$size获取长度,得到一个由所有数组长度组成的新数组。
  3. $sum:将$map生成的长度数组求和,得到所有数组的总长度,存入新增的totalFruits字段。
  4. $sort:根据totalFruits字段的值排序,-1表示降序排列,1表示升序排列。

这个方案可以适配countries字段包含任意键的情况,无论文档中的国家键是全集还是子集,都能正确计算总长度并排序。

内容的提问来源于stack exchange,提问作者Lucien Chardon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 01:57:29