首页 > 解决方案 > 在 azure CosmosDb 中查询嵌套的 JSON 属性

问题描述

我在为 cosmosDB 中的嵌套数据设计查询时遇到了一些困难。

假设我有数据存储在这个结构中:

{
   id:"1234",
   data:{
       people:{
           "a826bbc5-add9-42d8-ba52-f5de52973556":{
               first_name: "Kyle"
           },
           "efb119d-9f12-4d11-a7e1-38e4719a699c":{
               first_name: "Bob"
           },
           "b402faac-d1ba-4317-9ba6-673c76a8fc37":{
               first_name: "Jane"
           }
       }
   }
}

现在我想编写一个查询,返回所有名字为“Bob”的人

我需要类似的东西:

Select * from c where c.data.people[*].first_name = "Bob";

请注意,“人”对象是一个实际的 JSON 对象,而不是 JSON 数组,所以没有 array_contains,我基本上需要 JSON obj 等价物。

我环顾四周,似乎找不到适合这个常见用例的查询。

任何人都知道我可以如何完成这个查询?

标签: jsonazureazure-cosmosdb

解决方案


由于people对象的键是随机的,恐怕你不能用普通的sql查询它。我试图在cosmos db中用UDF实现你的需求。

udf代码:

function userDefinedFunction(peopleObj){
    var returnArray = [];
    for(var key in peopleObj){
        if (peopleObj[key].first_name == "Bob"){
            var map = {};
            map[key] = peopleObj[key];
            returnArray.push(map);
        }
    }
    return returnArray;
}

数据:

SELECT udf.test(c.data.people) as BobPeople FROM c

样本数据:

在此处输入图像描述

输出:

在此处输入图像描述


推荐阅读