替代 CosmosDB 中的 having 子句
Substitute for having clause in CosmosDB
我有以下查询结果,其中计数字段派生自聚合函数
[
{
"count": 1,
"facilityName": "Hyundai Service Center"
},
{
"count": 2,
"facilityName": "Honda Service Center"
},
{
"count": 1,
"facilityName": "Kat Service Center"
}
]
我只想显示计数 >= 2 的那些 facilityName。
我们怎样才能做到这一点?
我尝试用存储过程实现你的需求,请参考我的SP代码:
function sample(idArray) {
var collection = getContext().getCollection();
var length = idArray.length;
var sqlQuery = {
"query": 'SELECT count(c.id) as cnt, f.facilityName from c join f in c.facilities '+
'where array_contains( @idArray,c.id,true) ' +
'AND c.entityType = "ServiceInformationFacility" group by f.facilityName',
"parameters": [
{"name": "@idArray", "value": idArray}
]
}
// Query documents and take 1st item.
var isAccepted = collection.queryDocuments(
collection.getSelfLink(),
sqlQuery,
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 returenArray = [];
for(var i=0;i<feed.length;i++){
if(feed[i].cnt==length)
returenArray.push(feed[i])
}
response.setBody(returenArray);
}
});
if (!isAccepted) throw new Error('The query was not accepted by the server.');
}
输入参数:
["6ECF4568-CB0E-4E11-A5CD-1206638F9C39","2ECF4568-CB0E-4E11-A5CD-1206638F9C39"]
获取输出:
更新:
所以,如果你的集合是分区的,那么存储过程可能不适合你,因为分区键是执行SP.Please所必需的,请参阅我在这个线程中的详细解释:
实际上,我上面的spcode.It中没有复杂的逻辑,只是循环sql的结果并尝试找到object.count
等于idArray.length
哪个表示 object.facilityName 存在于所有文档中。
所以,你不必使用 SP,你可以使用任何一小段代码来处理我上面描述的逻辑。
我有以下查询结果,其中计数字段派生自聚合函数
[
{
"count": 1,
"facilityName": "Hyundai Service Center"
},
{
"count": 2,
"facilityName": "Honda Service Center"
},
{
"count": 1,
"facilityName": "Kat Service Center"
}
]
我只想显示计数 >= 2 的那些 facilityName。
我们怎样才能做到这一点?
我尝试用存储过程实现你的需求,请参考我的SP代码:
function sample(idArray) {
var collection = getContext().getCollection();
var length = idArray.length;
var sqlQuery = {
"query": 'SELECT count(c.id) as cnt, f.facilityName from c join f in c.facilities '+
'where array_contains( @idArray,c.id,true) ' +
'AND c.entityType = "ServiceInformationFacility" group by f.facilityName',
"parameters": [
{"name": "@idArray", "value": idArray}
]
}
// Query documents and take 1st item.
var isAccepted = collection.queryDocuments(
collection.getSelfLink(),
sqlQuery,
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 returenArray = [];
for(var i=0;i<feed.length;i++){
if(feed[i].cnt==length)
returenArray.push(feed[i])
}
response.setBody(returenArray);
}
});
if (!isAccepted) throw new Error('The query was not accepted by the server.');
}
输入参数:
["6ECF4568-CB0E-4E11-A5CD-1206638F9C39","2ECF4568-CB0E-4E11-A5CD-1206638F9C39"]
获取输出:
更新:
所以,如果你的集合是分区的,那么存储过程可能不适合你,因为分区键是执行SP.Please所必需的,请参阅我在这个线程中的详细解释:
实际上,我上面的spcode.It中没有复杂的逻辑,只是循环sql的结果并尝试找到object.count
等于idArray.length
哪个表示 object.facilityName 存在于所有文档中。
所以,你不必使用 SP,你可以使用任何一小段代码来处理我上面描述的逻辑。