MongoDb:重命名复杂文档中的属性

时间:2018-01-19 19:39:05

标签: c# json mongodb

我们有保存到MongoDb的文件。问题是我们的一个子文档有一个Id属性,它被返回为_id,由于它解释了Id字段的原因,导致了C#驱动程序的序列化/反序列化问题(参见{ {3}})

我想将该属性从Id重命名为SetId,但我们的数据是相当动态的,我在其他地方看到的简单字段重命名解决方案不适用。以下是一些经过大量编辑的简单数据的示例:

{
  "Id": "5a6238dbccf20b38b0db6cf2",
  "Title": "Simple Document",
  "Layout": {
    "Name": "Simple Document Layout",
    "Tabs": [
      {
        "Name": "Tab1",
        "Sections": [
          {
            "Name": "Tab1-Section1",
            "Sets": [
              {
                "Id": 1
              }
            ]
          }
        ]
      }
    ]
  }
}

与更复杂的数据进行比较:

{
  "Id": "5a6238dbccf20b38b0db6abc",
  "Title": "Complex Document",
  "Layout": {
    "Name": "Complex Document Layout",
    "Tabs": [
      {
        "Name": "Tab1",
        "Sections": [
          {
            "Name": "Tab1-Section1",
            "Sets": [
              {
                "Id": 1
              }
            ]
          },
          {
            "Name": "Tab1-Section2",
            "Sets": [
              {
                "Id": 1
              }
            ]
          }
        ]
      },
      {
        "Name": "Tab2",
        "Sections": [
          {
            "Name": "Tab2-Section1",
            "Sets": [
              {
                "Id": 1
              }
            ]
          }
        ]
      },
      {
        "Name": "Tab3",
        "Sections": [
          {
            "Name": "Tab3-Section1",
            "Sets": [
              {
                "Id": 1
              },
              {
                "Id": 2
              }
            ]
          }
        ]
      }
    ]
  }
}

请注意,Set.Id字段可以位于包含多个集的多个部分的多个标签上。我只是不知道如何处理查询以处理所有这些级别的重命名数据。

1 个答案:

答案 0 :(得分:0)

我接受了@ Veerum的建议,并对这个集合进行了手动迭代:

myCol = db.getCollection('myCol');
myCol.find({ "Layout.Tabs.Sections.Sets._id": {$exists: true} }).forEach(function(note) {
   for(tab = 0; tab != note.Layout.Tabs.length; ++tab) {
       for(section = 0; section != note.Layout.Tabs[tab].Sections.length; ++section) {
           for(set = 0; set != note.Layout.Tabs[tab].Sections[section].Sets.length; ++set) {
                note.Layout.Tabs[tab].Sections[section].Sets[set].SetId = NumberInt(note.Layout.Tabs[tab].Sections[section].Sets[set]._id);
               delete note.Layout.Tabs[tab].Sections[section].Sets[set]._id
           }
       }
   }
   myCol.update({ _id: note._id }, note);
});

也许有一种更有效的方式,但我们仍然使用Mongo v3.2,它似乎运作良好。