【问题标题】:Query Cosmos DB for the same objects from multiple schemas从多个模式中查询相同对象的 Cosmos DB
【发布时间】:2019-10-07 21:07:42
【问题描述】:

给出存储在 Cosmos DB 中的以下文档,如何获取所有子元素的 FirstName 字段为“Bob”的所有子元素?我正在尝试使用 SQL 查询语法,但没有找到结合两个文档架构结果的正确方法。

// Document 1
{
    "id": "document1",
    "Child": {
        "FirstName": "Bob",
        "LastName": "Smith"
    }
}

// Document 2
{
    "id": "document2",
    "Children": [
        {
            "Name": "Bob",
            "LastName": "Jones"
        },
        {
            "Name": "Sue",
            "LastName": "Jones"
        }
    ]
}

我正在尝试编写一个查询来查找所有“Bob”子元素以实现以下输出:

[
    {
        "FirstName": "Bob",
        "LastName": "Smith"
    },
    {
        "Name": "Bob",
        "LastName": "Jones"
    },
]

【问题讨论】:

  • 所以你有两个不同的名字child和children?
  • 更多的是一些文档只有一个“Child”元素,而其他文档在数组中具有该元素。在这种情况下,“Child”指的是通用结构而不是字段名称。

标签: azure-cosmosdb azure-cosmosdb-sqlapi


【解决方案1】:

Cosmos db 文档存储为 json 格式,不能用单个 sql 查询同等对待 Child 属性(上级结构)和 Children 属性(子结构)。

那就不能被展平放入一个物体中,请看例子:

c.Child 不显示。所以,恐怕你需要分别查询ChildChildren,然后根据你的要求合并它们。


我试图在这里解释。在一个单一的查询中 sql 是不可能的。例如,文档 1 不包含 Children Array,文档 2 包含。在一个 sql 中,C JOIN Children 是必需的。但是对于文档 1,Child join nothing is nothing 这样就不会拉出任何结果。你可以试试。

由于 cosmos db 不支持 UNION 功能,我仍然建议按照上述建议分别查询并合并。

【讨论】:

  • 不知道Child元素不存在的情况下是否可以使用coalesce来尝试拉出Child元素?
  • 不,很遗憾我没有找到更好的方法。
猜你喜欢
  • 2021-12-14
  • 2019-01-25
  • 1970-01-01
  • 2019-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-18
  • 2020-09-24
相关资源
最近更新 更多