【问题标题】:How I can replace the object key with root, in MongoDB如何在 MongoDB 中用 root 替换对象键
【发布时间】:2021-05-30 09:57:17
【问题描述】:
 "data": {
    "abc": {
      "Id": "100",
      "print": "number",
      "uploadAt" : "2021-22-01",
      "servicesAt" : "2020-01-12"



    },
    "xyz": {
      "Id": "123",
      "print": "number",
      "uploadAt" : "2021-22-01",
      "servicesAt" : "2020-01-12"
    }
}

说明 我想删除根datadata 对象abc 内部的其余部分,xyz 将保持原样,在第二步中,我想用@987654327 替换对象值number @key ,我想动态地做这个,

预期输出

{
    "abc": {
      "number": "100",
      "print": "number",
      "uploadAt" : "2021-22-01",
      "servicesAt" : "2020-01-12"
    },
    "xyz": {
      "number": "123",
      "print": "number",
      "uploadAt" : "2021-22-01",
      "servicesAt" : "2020-01-12"

    }
 }

【问题讨论】:

  • 您的 MongoDB 版本是多少?

标签: arrays mongodb mongoose mongodb-query aggregation-framework


【解决方案1】:

更新基于 cmets

解决方案 #3:

db.testCollection.aggregate([
    {
        $addFields: {
            "array": { $objectToArray: "$data" }
        }
    },
    { $unwind: "$array" },
    {
        $addFields: { "array.v.number": "$array.v.Id" }
    },
    {
        $project: { "array.v.Id": 0 }                      // Optional 
    },
    {
        $group: {
            _id: "$_id",
            array: { $push: "$array" }
        }
    },
    {
        $replaceRoot: {
            newRoot: { $arrayToObject: "$array" }
        }
    }
]);

解决方案 #2:如果您不想将归档的 Id 重命名为 number,那么解决方案很简单:

db.testCollection.aggregate([
    {
        $replaceRoot: {
            newRoot: {
                $arrayToObject: { $objectToArray: "$data" }
            }
        }
    }
]);

输出:

{
    "abc" : {
        "Id" : "100",
        "print" : "number",
        "uploadAt" : "2021-22-01",
        "servicesAt" : "2020-01-12"
    },
    "xyz" : {
        "Id" : "123",
        "print" : "number",
        "uploadAt" : "2021-22-01",
        "servicesAt" : "2020-01-12"
    }
}

旧解决方案

试试这个

db.testCollection.aggregate([
    {
        $replaceRoot: {
            newRoot: {
                $arrayToObject: {
                    $map: {
                        input: { $objectToArray: "$data" },
                        as: "item",
                        in: {
                            k: "$$item.k",
                            v: {
                                number: "$$item.v.Id",
                                print: "$$item.v.print",
                                uploadAt: "$$item.v.uploadAt",
                                servicesAt: "$$item.v.servicesAt"
                            }
                        }
                    }
                }
            }
        }
    }
]);

输出

{
    "abc" : {
        "number" : "100",
        "print" : "number",
        "uploadAt" : "2021-22-01",
        "servicesAt" : "2020-01-12"
    },
    "xyz" : {
        "number" : "123",
        "print" : "number",
        "uploadAt" : "2021-22-01",
        "servicesAt" : "2020-01-12"
    }
}

【讨论】:

  • 感谢您的回复,我想使用 2nd sol,但我在 `abc` xyz 下有多个对象,但这里我只提到 2 个,我如何获得其余的, ?例如我有"xyz":{"id":"123","print":"number","uploadAt":"Date"},所以我如何才能获得对象“uploadAt”等的其余部分
  • 我刚刚更新了我的帖子,对此我感到非常抱歉,我必须在发布之前解释一下。我很欣赏你的建议。谢谢
  • 感谢更新评论,这个 sol,我可以关注,但是如果我有 20--40 个对象会发生什么,我现在只提到其中 4 个。
  • 主要问题是将Id重命名为number,否则它只是v: "$$item.v"里面in
  • 如果我们先在v: "$$item.v" 里面做in 然后在下一阶段我们可以替换。?这可以解决问题吗?
猜你喜欢
  • 2023-04-04
  • 2020-10-15
  • 1970-01-01
  • 2020-01-09
  • 1970-01-01
  • 2020-11-08
  • 1970-01-01
  • 2020-09-14
  • 2022-01-19
相关资源
最近更新 更多