在cosmos documentDB中有一个查询,直到规则搜索

时间:2018-04-10 09:12:42

标签: azure azure-cosmosdb document-database

所以我试图从cosmos documentdb数据库中查询一些数据,如下所示

这是我的数据:

{

"id": "**********",

"triggers": [
    {
        "type": "enter_an_area",
        "trigger_identity": "***********",

        },

    },
    {
        "type": "enter_an_area",
        "trigger_identity": "********",

        },

    },
    {
        "type": "exit_an_area",
        "trigger_identity": "*******",


    },

这是我的集合中的一个文档,其中我为每个具有唯一ID的用户提供了一个文档,现在我要做的是计算使用特定触发器的用户数量,用户可能具有相同的触发器多个时间,正如您在示例中所看到的那样" enter_an_area"有一个以上的肠道,但我仍然想把它算作一个肠道。

我使用此查询来获取特定触发器的计数:

SELECT VALUE COUNT(1)FROM u JOIN t in u.triggers WHERE CONTAINS(t.type," enter_an_area")

但是对于上面的示例,这将返回:2我希望它返回1

有没有在documentdb中执行此操作的查询?如果没有这样的查询,有没有办法返回没有重复的结果?因为作为一个解决方案我认为我可以返回使用这个特定触发器的ID,但是当用户有一个以上的触发器时,我会得到重复的ID。

1 个答案:

答案 0 :(得分:0)

您的问题似乎与distinct这样的函数有关,查询结果会加入数组。我建议您使用存储过程来实现解决方案作为解决方法。

请参阅我的示例存储过程:

function sample() {
    var collection = getContext().getCollection();
    var isAccepted = collection.queryDocuments(
        collection.getSelfLink(),
        'SELECT u.id FROM u JOIN t in u.triggers WHERE CONTAINS(t.type, "enter_an_area")',
        function (err, feed, options) {
            if (err) throw err;
            if (!feed || !feed.length) getContext().getResponse().setBody('no docs found');
            else {
                var returnResult = [];
                var temp =''
                for(var i = 0;i<feed.length;i++){
                    var valueStr = feed[i].id;
                    if(valueStr != temp){
                        temp = valueStr;
                        returnResult.push(feed[i]) 
                    } 
                }
                getContext().getResponse().setBody(returnResult.length);
            }
        });

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

希望它对你有所帮助。

相关问题