Как искать через Array в CosmosDB, используя SQL - PullRequest
1 голос
/ 03 ноября 2019

У меня есть простой массив в документе в моем CosmosDB. Пример возврата SELECT * FROM c:

[
    {
        "id": "v1234567",
        "otherinfo": "othervalue",
        "log": [
            {
                "ts": 1572786079799,
                "e": "view1"
            },
            {
                "ts": 1572781436024,
                "e": "purchase"
            },
            {
                "ts": 1572786079799,
                "e": "view2"
            },
            {
                "ts": 1572786082033,
                "e": "view3"
            },
            {
                "ts": 1572781436024,
                "e": "purchase"
            },
            {
                "ts": 1572786082033,
                "e": "view4"
            }
        ],
        "_rid": "something",
        "_self": "something",
        "_etag": "\"something\"",
        "_attachments": "attachments/",
        "_ts": 1572786088
    }
]

Я хочу достичь двух вещей, но не могу понять, как смотреть в массивы.

  1. Returnпользователи (запись) где log[n].e = "purchase". Я думаю, что я достиг этого с помощью SELECT * from c WHERE ARRAY_CONTAINS(c.log, {"e": "atb"}, true)

  2. Вернуть идентификатор пользователя, «otherinfo» и часть журнала после первого события e="purchase", найденного в журнале. (в данном случае view2, view3, покупка, view4).

Я использую проводник документов в портале Azure. Пробовал соединять запросы, которые мгновенно завершаются неудачей (потому что, вероятно, я ошибаюсь).

1 Ответ

0 голосов
/ 04 ноября 2019

Пожалуйста, используйте приведенную ниже хранимую процедуру, которую я успешно протестировал для реализации ваших потребностей:

function sample(prefix) {
    var collection = getContext().getCollection();

    var isAccepted = collection.queryDocuments(
        collection.getSelfLink(),
        'SELECT c.id,c.otherinfo,c.log from c WHERE ARRAY_CONTAINS(c.log, {"e": "view2"}, true)',
    function (err, feed, options) {
        if (err) throw err;

        // Check the feed and if empty, set the body to 'no docs found', 
        // else take 1st element from feed
        if (!feed || !feed.length) {
            var response = getContext().getResponse();
            response.setBody('no docs found');
        }
        else {
            var response = getContext().getResponse();
            for(var i=0;i<feed.length;i++){
                console.log(i)
                var logArray = [];
                for(var j=0;j<feed[i].log.length;j++){
                    console.log(feed[i].log[j].e)
                    logArray.push({"e":feed[i].log[j].e});
                }
                feed[i].log = logArray;
            }

            response.setBody(feed);
        }
    });

    if (!isAccepted) throw new Error('The query was not accepted by the server.');
}

Вывод:

enter image description here

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