首页 > 解决方案 > Mongodb通过数组中的对象键查询并替换键

问题描述

如何查询所有有昵称的人并将昵称键替换为“nick”

数据集看起来像这样,有更多的字段和更多的文档。如果昵称 obj 存在,则它位于未知索引中。

{
  _id: "robert",
  properties: [
    {
      "kids": 3
    },
    {
      "nickname": "Bob"
    },
    {
      "age": 45
    }
  ]
}

{
  _id: "alice",
  properties: [
    {
      "kids": 3
    },
    {
      "age": 45
    }
  ]
}

{
  _id: "joseph",
  properties: [
    {
      "nickname": "joe"
    }
  ]
}

最后应该是:

{
  _id: "robert",
  properties: [
    {
      "kids": 3
    },
    {
      "nick": "Bob"
    },
    {
      "age": 45
    }
  ]
}

{
  _id: "alice",
  properties: [
    {
      "kids": 3
    },
    {
      "age": 45
    }
  ]
}

{
  _id: "joseph",
  properties: [
    {
      "nick": "joe"
    }
  ]
}

标签: node.jsmongodbmongodb-query

解决方案


以下查询可以解决问题。我们正在聚合collection以将字段更改properties.nickname为聚合输出properties.nick并将现有数据替换collection为聚合输出。

db.collection.aggregate([
  {
    $addFields:{
      "properties":{
          $map:{
          "input":"$properties",
          "as":"property",
          "in":{
            $mergeObjects:[
              "$$property",
              {
                "nick":"$$property.nickname"
              }
            ]
          }
        }
      }
    }
  },
  {
    $project:{
      "properties.nickname":0
    }
  },
  {
    $out:"collection"
  }
])

前:

{
  "_id" : "robert",
  "properties" : [
    {
      "kids" : 3
    },
    {
      "nickname" : "Bob"
    },
    {
      "age" : 45
    }
  ]
}
{
  "_id" : "alice",
  "properties" : [
    {
      "kids" : 3
    },
    {
      "age" : 45
    }
  ]
}
{ "_id" : "joseph", "properties" : [ { "nickname" : "joe" } ] }

后:

{
  "_id" : "robert",
  "properties" : [
    {
      "kids" : 3
    },
    {
      "nick" : "Bob"
    },
    {
      "age" : 45
    }
  ]
}
{
  "_id" : "alice",
  "properties" : [
    {
      "kids" : 3
    },
    {
      "age" : 45
    }
  ]
}
{ "_id" : "joseph", "properties" : [ { "nick" : "joe" } ] }

推荐阅读