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

MongoDB聚合:将两个数组配对生成对象数组的问题求助

解决MongoDB数组配对转换的问题

你的需求是把文档中两个平行数组userhasRate和ratings按索引对应,合并成一个包含对象的rate数组,同时保留原文档的其他字段对吧?之前用$group的思路不太对,因为$group是用于跨文档分组聚合的,而你需要的是单文档内的数组映射处理。

正确的聚合查询

可以用$zip和$map组合来实现这个需求,具体的聚合管道如下:

db.getCollection('contens').aggregate([
  {
    $project: {
      contributor: 1,
      title: 1,
      rate: {
        $map: {
          input: {
            $zip: {
              inputs: ["$userhasRate", "$ratings"],
              useLongestLength: false // 确保两个数组长度一致时才配对,可根据需求调整
            }
          },
          as: "pair",
          in: {
            userhasrate: { $arrayElemAt: ["$$pair", 0] },
            value: { $arrayElemAt: ["$$pair", 1] }
          }
        }
      }
    }
  }
])

步骤解释

  • $zip:将userhasRate和ratings两个数组按索引位置配对,生成类似[["51",4], ["52",3]]的二维数组。useLongestLength设为false时,只有当两个数组长度完全匹配才会生成配对,避免出现空值。
  • $map:遍历$zip生成的二维数组,将每个子数组转换成你需要的对象结构:用$arrayElemAt取出子数组的第一个元素作为userhasrate,第二个作为value。
  • $project:保留原文档的_id(默认保留)、contributor、title字段,同时将处理后的数组命名为rate。

执行结果

运行上述查询后,你会得到期望的文档结构:

{
  "_id" : ObjectId("5cf12696e81744d2dfc0000c"),
  "contributor": "user1",
  "title": "Title 1",
  "rate" : [
    { "userhasrate": "51", "value": 4 },
    { "userhasrate": "52", "value": 3 }
  ]
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:59:27