Запрос CosmosDb неструктурированный JSON

Как CosmosDB может запрашивать значения свойств в динамическом JSON?

Приложение позволяет хранить JSON как набор настраиваемых свойств объекта. Они сериализуются и хранятся в CosmosDb. Например, вот две записи:

{
    "id": "ade9f2d6-fff6-4993-8473-a2af40f071f4",
    ...
    "Properties": {
        "fn": "Ernest",
        "ln": "Hemingway",
        "a_book": "The Old Man and the Sea"
    },
    ...
}

а также

{
    "id": "23cb9d4c-da56-40ec-9fbe-7f5178a92a4f",
    ...
    "Properties": {
        "First Name": "Salvador",
        "Last Name": "Dali",
        "Period": "Surrealism"
    },
    ...
}

Как можно структурировать запрос таким образом, чтобы он выполнял поиск по значениям Properties?


person Ovi    schedule 24.09.2018    source источник
comment
Вы говорите о запросах C # LINQ или SQL?   -  person Nick Chapsas    schedule 24.09.2018
comment
Что угодно :) Но я думаю, что SQL будет лучше, так как больше людей могут использовать эту идею.   -  person Ovi    schedule 24.09.2018
comment
@Ovi Привет, мой ответ тебе поможет?   -  person Jay Gong    schedule 26.09.2018
comment
@JayGong - определенно сработало. В итоге я немного изменил его. Просто опубликовано как комментарий к вашему ответу   -  person Ovi    schedule 26.09.2018
comment
@Ovi Спасибо за ваше изменение. Я уже резюмировал его в своем ответе.   -  person Jay Gong    schedule 27.09.2018


Ответы (2)


Я ищу что-то, что не связано с названием подпропеты, например SELECT * FROM c WHERE some_function_here (c.Properties, ‘Ernest’)

Возможно, я понял, что вы хотите фильтровать документы по значению Properties, а не по имени. Если это так, вы можете использовать UDF в cosmos db. .

образец udf:

function query(Properties,filedValue){
    for(var k in Properties){  
        if(Properties[k] == filedValue)
            return true;  
    }
    return false;
}

образец запроса:

SELECT  c.id FROM c where udf.query(c.Properties,'Ernest')

вывод:

введите здесь описание изображения


Вкратце, функция udf в Ovi:

function QueryProperties (Properties, filedValue) {     
    for (var k in Properties) { 
        if (Properties[k] && Properties[k].toString().toUpperCase().includes(filedValue.toString().toUpperCase())) 
            return true;    
    return false; 
}
person Jay Gong    schedule 25.09.2018
comment
Спасибо, в итоге пришлось немного модифицировать, но идея идеальная: function QueryProperties (Properties, filedValue) { for (var k in Properties) { if (Properties[k] && Properties[k].toString().toUpperCase().includes(filedValue.toString().toUpperCase())) return true; } return false; } - person Ovi; 26.09.2018

Оба следующих синтаксиса будут работать.

SELECT * FROM c where c.Properties["First Name"] = 'Salvador'

SELECT * FROM c where c.Properties.fn = 'Ernest'
person Nick Chapsas    schedule 24.09.2018
comment
Это не совсем решает проблему, Ник. Я ищу что-то, что не связано с названием подпроекта, например SELECT * FROM c WHERE some_function_here(c.Properties, ‘Ernest’) - person Ovi; 25.09.2018
comment
@Ovi Твой вопрос непонятен. UDF Джея решит проблему. - person Nick Chapsas; 25.09.2018