【问题标题】:Efficiently to NOT EXSISTS when query in documentDb?在 documentDb 中查询时有效地不存在?
【发布时间】:2018-05-15 01:25:31
【问题描述】:

假设我们有两个集合,一个用户集合和一个项目集合。

用户集合,每个User文档存储用户的购买产品id。

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

Item集合,每个Item文档存储产品信息。

{
 "Id" : "ProductId1" 
}

我希望查询将返回项目集合的前 10 个项目,按上次更新时间排序,另外,如果用户之前已经购买过该项目,则查询应该跳过用户购买的项目并返回未购买的项目仅限项目。

在 MsSQL 中我们可以简单地不存在,我们如何在 documentDB 中有效地做到这一点?

我们如何在 documentDB 中做到这一点?

我可以想象我们当然可以通过

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

但实际上,如果每个用户都购买了超过 500 件商品,这是否更有效?

什么是有效的方法?

【问题讨论】:

  • 购买的商品id是否作为数组存储在用户集合中?请提供您在馆藏文件中的样本格式?
  • @JayGong 我不知道除了存储在数组中还有什么其他方法。实际上,我的问题是可以将任何结构更改为使其高效。我应该如何存储数据以使其执行 NOT EXISTS 表现良好?

标签: performance nosql azure-cosmosdb


【解决方案1】:

到目前为止,我的 researchExistNOT 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 作为参数传入存储过程。

希望对你有帮助。

【讨论】:

  • 谢谢,如果我必须在 documentDb 中这样做,我想这是最好的方法
猜你喜欢
  • 1970-01-01
  • 2012-01-12
  • 2018-03-08
  • 1970-01-01
  • 2011-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多