performance - 在 documentDb 中查询时有效地不存在?
问题描述
假设我们有两个集合,一个用户集合和一个项目集合。
用户集合,每个User文档存储用户的购买产品id。
{
"id" : "UserA",
"PurchasedProductId" : ["ProductId1", ... "ProductIdNN"]
}
商品集合,每个商品文档存储商品信息。
{
"Id" : "ProductId1"
}
我希望查询将返回项目集合的前 10 个项目,按上次更新时间排序,另外,如果用户之前已经购买过该项目,则查询应该跳过用户购买的项目并仅返回未购买的项目。
在 MsSQL 中我们可以简单地不存在,我们如何在 documentDB 中有效地做到这一点?
我们如何在 documentDB 中做到这一点?
我可以想象我们当然可以通过
SELECT * WHERE (c.id != id1 && c.id != id2 && ..... c.id != idNNNN) LIMIT 10
但实际上,如果每个用户都购买了超过 500 件商品,这还有效吗?
什么是有效的方法?
解决方案
根据我的研究,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
作为参数传递给存储过程。
希望它可以帮助你。
推荐阅读
- arduino - 使用 PlatformIO (Arduino) 从内部振荡器运行 STM32F103?
- typescript - 为什么 querySelectorAll('div') 返回 HTMLDivElement 列表但 querySelectorAll('div.className') 返回 TypeScript 中的 Element 列表
- python - 我正在查看列表二中的项目是否是列表一中每个位置数据的三倍
- database - 3NF 表是否可以有一个具有重复值的 PK,但所有非键都依赖于 PK(无传递依赖)?
- spring-kafka - 重新排队kafka主题中的失败记录
- python - 获取url图片scrapy
- javascript - 引导卡垂直显示而不是响应式
- android - 在 Xamarin 中迁移到 Android X 后出现 MediaSessionCompat_OnActiveChangeListenerImplementor 错误
- angular - Angular NgModule 文档混乱
- python - 我怎么说:“如果 VALUE 减少:”在 Python 中?