Эффективно НЕ СУЩЕСТВУЕТ ли когда запрос в documentDb? - PullRequest
0 голосов
/ 15 мая 2018

Допустим, у нас есть две коллекции: коллекция пользователей и коллекция элементов.

Коллекция пользователей, в каждом документе пользователя хранятся идентификаторы продуктов покупки пользователя.

{
 "id" : "UserA",
 "PurchasedProductId" : ["ProductId1", ... "ProductIdNN"]
}

Коллекция предметов, каждый документ Item хранит информацию о продукте.

{
 "Id" : "ProductId1" 
}

Я хочу, чтобы запрос возвращал первые 10 элементов коллекции элементов, упорядоченных по времени последнего обновления, плюс, если пользователь уже приобрел элемент ранее, запрос должен пропустить приобретенный пользователем элемент и вернуть не купленный только предмет.

В MsSQL мы могли бы просто НЕ СУЩЕСТВОВАТЬ, как нам эффективно это сделать в documentDB?

Как нам это сделать в documentDB?

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

SELECT * WHERE (c.id != id1 && c.id != id2 && ..... c.id != idNNNN) LIMIT 10

Но на самом деле, если каждый пользователь купил более 500 предметов, это даже эффективно?

Какой эффективный способ сделать это?

1 Ответ

0 голосов
/ 15 мая 2018

По моим исследованиям , Exist и NOT Exists пока не поддерживаются в запросе cosmos db.Итак, я предлагаю вам использовать хранимую процедуру для получения желаемых результатов.

образец хранимой процедуры:

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

    //var alreadyPurchaseIdsArray = ["1","2","3"]

    var isAccepted = collection.queryDocuments(
    collection.getSelfLink(),
        'SELECT top 10 c.id FROM c ',
    function (err, feed, options) {
        if (err) throw err;
        if (!feed || !feed.length) {
            var response = getContext().getResponse();
            response.setBody('no docs found');
        }else {
            var response = getContext().getResponse();
            var returnResult = [];
            for(var i = 0;i<feed.length;i++){
                if(alreadyPurchaseIdsArray.indexOf(feed[i].id) == -1)
                returnResult.push(feed[i]);
                getContext().getResponse().setBody(returnResult);
            }
        }
        });

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

alreadyPurchaseIdsArray isпередан в хранимую процедуру в качестве параметра.

Надеюсь, он вам поможет.

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