使用没有“元信息”的子文档创建DocumentDB文档

时间:2017-11-27 11:00:32

标签: .net azure azure-cosmosdb

这让我在自我递归的圈子里进行了两天。

我有一个递归的ObjectModel,我将单个对象转换为Microsoft.Azure.Documents.Document。当我使用递归时,下面示例中的“phone_numbers”属性为List(Of Document)。 如何摆脱"_rid", "_self", "_ts", "_etag"属性?由于不知道它们叫什么,让我称之为元属性。 我想在保存到数据库之前删除它们,或者 - 甚至更好 - 避免生成它们?

我的代码生成的内容:

{
  "id": "object768f02af46b24a5c86c1e5eeaae721c6",
  "family_name": "Green",
  "given_name": "Thomas",
  "phone_numbers": [
    {
      "id": "eb8e6d6b6317499c96c568a2b6088101",
      "_rid": null,
      "_self": null,
      "_ts": 0,
      "_etag": null,
      "name": "private phone",
      "number": "564894654"
    },
    {
      "id": "e8ffb8de9d55489cb84d3342189240c1",
      "_rid": null,
      "_self": null,
      "_ts": 0,
      "_etag": null,
      "name": "work phone",
      "number": "654649684684"
    }
  ]
}

这是Document.ToString()在将其写入DocumentDB之前未经修改的输出。我不知道为什么此时根文档中没有元标记。但我似乎也不需要他们,因为......

保存到数据库的内容:

{
    "id": "object768f02af46b24a5c86c1e5eeaae721c6",
    "_rid": "9ikLAL9mDQATAAAAAAAAAA==",
    "_self": "dbs/9ikLAA==/colls/9ikLAL9mDQA=/docs/9ikLAL9mDQATAAAAAAAAAA==/",
    "_etag": "\"00000200-0000-0000-0000-5a1bed1c0000\"",
    "family_name": "Green",
    "given_name": "Thomas",
    "phone_numbers": [
        {
            "id": "eb8e6d6b6317499c96c568a2b6088101",
            "_rid": null,
            "_self": null,
            "_ts": 0,
            "_etag": null,
            "name": "private phone",
            "number": "564894654"
        },
        {
            "id": "e8ffb8de9d55489cb84d3342189240c1",
            "_rid": null,
            "_self": null,
            "_ts": 0,
            "_etag": null,
            "name": "work phone",
            "number": "654649684684"
        }
    ],
    "_attachments": "attachments/",
    "_ts": 1511779612
}

...在写入DocumentDB时会创建根对象的正确元标记。大。但是子文档中的元标记是emtpy。我不需要它们,显然DocumentDB也不需要它们。

我最终想要保存到数据库中的内容:

{
    "id": "object768f02af46b24a5c86c1e5eeaae721c6",
    "_rid": "9ikLAL9mDQATAAAAAAAAAA==",
    "_self": "dbs/9ikLAA==/colls/9ikLAL9mDQA=/docs/9ikLAL9mDQATAAAAAAAAAA==/",
    "_etag": "\"00000200-0000-0000-0000-5a1bed1c0000\"",
    "family_name": "Green",
    "given_name": "Thomas",
    "phone_numbers": [
        {
            "id": "eb8e6d6b6317499c96c568a2b6088101",
            "name": "private phone",
            "number": "564894654"
        },
        {
            "id": "e8ffb8de9d55489cb84d3342189240c1",
            "name": "work phone",
            "number": "654649684684"
        }
    ],
    "_attachments": "attachments/",
    "_ts": 1511779612
}

我发现很难找到与DocumentDB相关的信息,Microsoft.Azure.Documents的内部工作方式以及缺乏正确术语的知识,因此非常感谢指导。

1 个答案:

答案 0 :(得分:1)

Microsoft.Azure.Documents.Document documentation声明它

  

表示Azure Cosmos数据库服务中的文档。

它是Resource class的特殊子类型,因此它包含所有DocumentDB资源级对象所需的元属性。

在您的情况下,通过尝试抑制它的资源行为,您尝试将该类型用于不适合的场景。这一直是重新考虑您的设计的警告信号。

仍然,你能做什么:

备选方案1:在序列化期间删除默认值

您不想要的字段使用默认值。如果需要,可以从序列化JSON中省略这些字段。您可以使用Document.SaveTo(Stream, SerializationFormattingPolicy, JsonSerializerSettings)方法使用自定义设置进行序列化。

请注意,它还会影响模型中具有默认值的其他字段。这可能是也可能不是你想要的。

备选方案2:自定义模型类

您可以考虑定义一个强类型显式存储模型,该模型仅包含您希望存储的属性以及它们之间或其他模型之间的必要转换逻辑。如果您不需要这些元字段,则不要包含它们。

备选方案3:JObject

您可以考虑改为使用Newtonsoft's JObject type

这与Document一样灵活,但它可以让您完全控制最终会出现在文档中的JSON。在将聚合文档保存到DocumentDB之前,只需显式删除任何不需要的电话号码项元属性。