【问题标题】:Create DocumentDB Document with child Documents without "meta-information"使用没有“元信息”的子文档创建 DocumentDB 文档
【发布时间】:2017-11-27 11:00:31
【问题描述】:

这让我在自递归循环中转了两天。

我有一个递归 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 时创建的。伟大的。但是子文档中的元标记是空的。我不需要它们,显然 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 的内部工作原理,并且我缺乏正确术语的知识,因此非常感谢您提供该方向的指针。

【问题讨论】:

    标签: .net azure azure-cosmosdb


    【解决方案1】:

    Microsoft.Azure.Documents.Document documentation 声明它

    表示 Azure Cosmos DB 服务中的文档。

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

    在你的情况下,通过试图抑制它的资源行为,你试图将类型用于它不打算用于的场景。这始终是重新考虑您的设计的警告信号。

    不过,你能做什么:

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

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

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

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

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

    备选方案 3:JObject

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

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

    【讨论】:

    • “这始终是重新考虑您的设计的警告信号。”...我的蜘蛛感觉很痒,但正如我在问题中所说,很难找到关于此的可消化信息。我什至在 stackoverflow 上都找不到合适的“documentdb”标签,只有 azure-cosmosdb,尽管这与 Cosmosdb 不完全相关。无论如何,很好的答案,正是我现在需要的那种建议!谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    相关资源
    最近更新 更多