【问题标题】:Unable to queries in nested object in CosmosDB entry无法查询 CosmosDB 条目中的嵌套对象
【发布时间】:2021-04-12 10:44:09
【问题描述】:

当存在多个具有相同 id 的嵌套项时,是否有办法在 CosmosDB 中的文档中查询嵌套对象:

{
  id: "GUID", 
    "items"[ 
     {   
         "item": {
            "item_id": "123456",
            "order_name": "name1"
          },
         "item": {
             "item_id": "123456",
             "order_name": "name2",
          }
    }]
} 

我希望检查 item_id 并拉回 item 对象。使用查询SELECT c.item FROM c WHERE c.item.item_id = '123456' 仅在只有一个项目但有多个项目时才有效,查询不会返回任何内容。使用查询 SELECT * FROM c WHERE c.item.item_id = '123456' 也不会返回任何内容。

【问题讨论】:

  • 我不确定我是否完全理解您的数据模型,因为您所展示的内容并没有真正起作用。您有两个"item" 子文档,每个子文档都具有完全相同的键名"item"。你能澄清一下吗?注意:如果将数据放入键中会给您带来困难的查询场景,我认为这是一种反模式。仅供参考,看看this answer 我不久前发布的,正是在谈论这个。
  • JSON中的key应该是唯一的:RFC-4627,那么你将如何访问不同的items呢?
  • 因此,通过编辑:您仍然有相同的基本数据建模问题:您使用文字字符串(一些数据)作为您的键。这真的不是你应该做的事情。你甚至不需要那个键——你可以只包含你的子文档。或者,如果每个数组项有多个子文档,则可以为键设置一个属性,例如 item - 而不是字符串。

标签: sql azure-cosmosdb


【解决方案1】:

我不确定我是否完全理解您的问题,但这里有几种处理嵌套查询的方法:

选项 1:

SELECT
    c.id,
    items
FROM c
JOIN (SELECT 
        b.item_id,
        b.order_name
    FROM b WHERE b.parentID = c.id) AS items

查询会将“items”字段作为对象返回

选项 2:

SELECT
    c.id,
    ARRAY (
        SELECT 
            b.item_id,
            b.order_name
        FROM b WHERE b.parentID = c.id)
    ) AS items
FROM c

查询将“items”字段作为对象数组返回

【讨论】:

  • 这不是嵌套查询的问题;这是实际架构的问题。此外,查询嵌套数组中的数据是通过ARRAY_CONTAINS() 实现的,这显示在我在评论中链接到的答案中。
  • @DavidMakogon 感谢您澄清问题。与“ARRAY_CONTAINS”相关的是表示数组是否包含指定的值,对吗? “ARRAY”关键字用于从子查询的结果link构造一个数组。
猜你喜欢
  • 2020-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-26
相关资源
最近更新 更多