Фильтровать значение даты и времени в коллекции JSON коллекции внутри CosmoDB с использованием SQL - PullRequest
0 голосов
/ 19 февраля 2019

Использование Microsoft CosmoDBs как синтаксис SQL.У меня есть коллекция записей, которые следуют такой схеме (упрощенно для этого поста)

{"id":"123456",
 "activities": {
       "activityA": {
                "loginType": "siteA",
                "lastLogin": "2018-02-06T19:42:22.205Z"
            },
       "activityB": {
                "loginType": "siteB",
                "lastLogin": "2018-03-07T11:39:50.346Z"
            },
       "activityC": {
                "loginType": "siteC",
                "lastLogin": "2018-04-08T15:21:15.312Z"
            }
        }
}

Не зная точного индекса в списке действий / подгруппах записей действий, как я могу запросить, чтобы вернуть всеэлементы в коллекции базы данных Cosmo, у которых «lastLogin» соответствует диапазону дат?

Если бы я хотел выполнить поиск только по первому элементу в списке действий, я мог бы сделать что-то подобное, используя индекс 0.

SELECT * FROM c where (c.activities[0].lastLogin > '2018-01-01T00:00:00') and (c.activities[0].lastLogin <= '2019-02-15T00:00:00')

Но я хочу найти все записи в списке.Было бы неплохо, если бы было что-то вроде этого:

SELECT * FROM c where (c.activities[?].lastLogin > '2018-01-01T00:00:00') and (c.activities[?].lastLogin <= '2019-02-15T00:00:00')

Но этого не существует.

1 Ответ

0 голосов
/ 22 февраля 2019

Ответ в том, что вы не можете перебрать коллекцию, не относящуюся к списку.Если бы элемент коллекции был структурирован следующим образом:

{"id":"123456",
 "activities": [
            {   "label": "activityA",
                "loginType": "siteA",
                "lastLogin": "2018-02-06T19:42:22.205Z"
            },
            {
                "label": "activtyB",
                "loginType": "siteB",
                "lastLogin": "2018-03-07T11:39:50.346Z"
            }, 
etc... 

Было бы легко скомпоновать UDF для повторения с чем-то вроде этого

UDF: filterActivityList

function(activityList,  targetDateTimeStart, targetDateTimeEnd) {
    var s, _i, _len;
    for (_i = 0, _len = activityList.length; _i < _len; _i++) {

        s = activityList[_i];

        if ((s.lastLogin >= targetDateTimeStart) && (s.lastLogin < targetDateTimeEnd)) 
        {

            return true;
       }

    }
    return false;
}

Затем запросить:

выбрать * из c ГДЕ udf.filterActivityList (c.activities, '2018-01-01T00: 00: 00', '2018-02-01T00: 00:00 ');

Если бы я оставил структуру как иерархию JSON вместо ее преобразования в список JSON, мне пришлось бы написать еще один udf-файл, чтобы принять узел верхнего уровня иерархии в качестве входного параметраи пусть он преобразует примечания под ним в список, а затем применяет UDF udf.filterActivityList к результату.Исходя из моего опыта, этот подход требует значительных ресурсов и занимает много времени для обработки Cosmo.

...