【问题标题】:MongoDB: Project embedded fields in an object with dynamic keyMongoDB:使用动态键在对象中投射嵌入字段
【发布时间】:2020-04-09 05:38:14
【问题描述】:

作为我正在做的聚合的一部分,我最终得到了以下格式的数据结构 -

{
  "name": "ABCD",
  "data": {
    "id1": {"data1": 123, "data2": 234, "data3": 345, "data4": 456},
    "id2": {"data1": 321, "data2": 432, "data3": 543, "data4": 654},
    "id3": {"data1": 111, "data2": 222, "data3": 333, "data4": 444},
    "id4": {"data1": 555, "data2": 666, "data3": 777, "data4": 888},
  }
}

完全相同的数据字段(data1、data2....)将出现在所有 id 字段(id1、id2...)中

在我的最后一步聚合中 - 我只想在数据中投影几个字段,例如 data2data3,如下所示 -

{
  "name": "ABCD",
  "data": {
    "id1": {"data2": 234, "data3": 345},
    "id2": {"data2": 432, "data3": 543},
    "id3": {"data2": 222, "data3": 333},
    "id4": {"data2": 666, "data3": 777},
  }
}

对此我的预测步骤是什么?

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:

    尝试添加以下阶段:

    db.collection.aggregate([
      {
        $addFields: { /** Re-create 'data' field */
          "data": {
            $arrayToObject: { /** Convert new 'data' array to object */
              $map: {
                input: {
                  $objectToArray: "$data" /** Convert 'data' object to array for iteration */
                },
                in: {
                  k: "$$this.k",
                  v: {
                    data2: "$$this.v.data2",
                    data3: "$$this.v.data3"
                  }
                }
              }
            }
          }
        }
      }
    ])
    

    测试: MongoDB-Playground

    参考:aggregation-operators

    【讨论】:

    • 谢谢@whoami。但是没有更简单的 project 步骤来执行此操作吗?
    • @VinayNikhil : 如果你在 data 对象中有动态键 -> 我猜没有,但如果你确定有键 id1, id2, id3 & id4 然后你可以试试 :: (mongoplayground.net/p/IrPqCvBhp_Q) ({ $project: { "data.id1": { data2: "$data.id1.data2", data3: "$data.id1.data3" }}}.......) 或 ({ $project: { "data.id1.data2": 1, "data.id1.data3": 1 } }......)
    • data 对象内的键是动态的。因此问题
    • @VinayNikhil :是的,这就是为什么我们需要做额外的步骤,否则我们通常不需要......
    猜你喜欢
    • 1970-01-01
    • 2013-01-08
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多