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

如何在MongoDB中将字段值设置为对象键?

解决方案

你之前的写法无法生效,是因为MongoDB的$project阶段不支持直接用字段值作为动态键名,必须通过$arrayToObject来实现这个需求。以下是两种符合你需求的聚合管道写法:

1. 每个文档输出为独立的键值对象

这个写法会把每个原始文档转换成你期望的单个键值对结构:

db.collection.aggregate([
  {
    $replaceRoot: {
      newRoot: {
        $arrayToObject: [
          [
            {
              k: "$type",
              v: {
                _id: "$_id",
                priority: "$priority"
              }
            }
          ]
        ]
      }
    }
  }
])

逻辑说明:

  • 先构造一个包含k(键名,取自type字段)和v(键值,包含_id和priority)的数组
  • 用$arrayToObject将这个数组转换成目标对象
  • 最后用$replaceRoot把这个对象设为文档的根,得到你想要的结构

2. 将所有文档合并为一个大对象

如果需要把所有结果合并成一个包含所有type键的单一对象,可以用以下管道:

db.collection.aggregate([
  {
    $group: {
      _id: null,
      mergedData: {
        $mergeObjects: {
          $arrayToObject: [
            [
              {
                k: "$type",
                v: { _id: "$_id", priority: "$priority" }
              }
            ]
          ]
        }
      }
    }
  },
  {
    $replaceRoot: { newRoot: "$mergedData" }
  }
])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 12:05:30