Запрос на вложенное JSON свойство в azure CosmosDb - PullRequest
2 голосов
/ 07 января 2020

У меня возникли некоторые трудности при создании запроса для вложенных данных в 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"
           }
       }
   }
}

Теперь я хочу написать запрос, который вернул бы всех людей с именем «Боб»

Мне нужно что-то вроде:

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

Обратите внимание, что объект "people" является фактическим JSON объектом, а не массивом JSON, поэтому нет array_contains, мне нужен в основном эквивалент JSON obj .

Я огляделся и не могу найти подходящий запрос для этого общего варианта использования.

Кто-нибудь знает, как я могу выполнить sh этот запрос?

Ответы [ 2 ]

1 голос
/ 08 января 2020

Отмеченный ответ Джея как принятый ответ, когда я в конечном итоге использовал udfs - я опубликую функцию, которую я в конечном итоге использовал, и запрос для тех, кто ищет что-то более общее c.

function userDefinedFunction(properties, fieldName, filedValue){
    for(var k in properties){  
        if(properties[k][fieldName] && properties[k][fieldName] == filedValue)
            return true;  
    }
    return false;
}

с запросом:

select * from c where udf.hasValue(c.data.people,"first_name","Bob")
1 голос
/ 08 января 2020

Поскольку ключ people объектов является случайным, боюсь, вы не можете запросить его с помощью обычного sql. Я пытался реализовать ваши потребности с помощью 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;
}

Sql:

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

Пример данных:

enter image description here

Выход:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...