У меня есть коллекция, содержащая документы со следующей структурой:
{
"Identifier": 1,
"Values": {
"value1": "33806",
"value2": "10",
"value3": "0"
},
...
}
Я создал UDF для извлечения ключей из словаря Values
:
function getKeys(dictionary) {
let result = [];
for (var key in dictionary) {
result.push(key);
}
return result;
}
И у меня есть запрос, который использует UDF для поиска всех отдельных ключей в словаре Values
. Следующий код вызывает CosmosDB с помощью библиотеки пакетов Microsoft.Azure.DocumentDB.Core
nuget:
var query = $@"
SELECT DISTINCT
VALUE i
FROM
(
SELECT
VALUE
{{
'keys': udf.getKeys(c.Values),
'id': c.Identifier
}}
FROM c
WHERE c.Identifier = @Identifier
) AS dt
JOIN i in dt.keys";
var parameters = new SqlParameterCollection(new[]
{
new SqlParameter("@Identifier", identifier)
});
var documentQuery = store.Query(new SqlQuerySpec(query, parameters));
Это работает с эмулятором Azure CosmosDB. Запрос отлично работает, когда я запускаю его через пользовательский интерфейс на http://localhost:8081
.
При выполнении запроса через .NET-клиент я получаю следующую ошибку:
Microsoft.Azure.Documents.BadRequestException: Сообщение: {«ошибки»: [{«серьезность»: «Ошибка», «местоположение»: {«начало»: 25, «конец»: 33}, «код»: «SC1001» , "message": "Синтаксическая ошибка, неправильный синтаксис рядом с 'DISTINCT'."}]}, Windows / 10.0.16299 documentdb-netcore-sdk / 1.9.1 ---> System.Runtime.InteropServices.COMException: исключение из HRESULT : 0x800A0B00
Я еще не пробовал это против реального CosmosDB, однако тот факт, что это работает в проводнике данных, заставляет меня думать, что это не проблема с возможностями эмулятора.