Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 计数连续字段发生的最高数量_Javascript_Mongodb_Mapreduce_Mongodb Query_Aggregation Framework - Fatal编程技术网

Javascript 计数连续字段发生的最高数量

Javascript 计数连续字段发生的最高数量,javascript,mongodb,mapreduce,mongodb-query,aggregation-framework,Javascript,Mongodb,Mapreduce,Mongodb Query,Aggregation Framework,在这样的集合中: db.consFieldTest.insert([ {状态:“err”} {状态:“suc”} {状态:“res”} {状态:“res”} {状态:“err”} {状态:“err”} {状态:“err”} ]); 聚合结果应如下所示: {status:“err”,maxCons:3}, //(可选){状态:“suc”,maxCons:1}, //(可选){状态:“res”,maxCons:2} 实际上,如果maxCons计数器停止在3,就可以了,我需要知道err状态是否连续

在这样的集合中:

db.consFieldTest.insert([
{状态:“err”}
{状态:“suc”}
{状态:“res”}
{状态:“res”}
{状态:“err”}
{状态:“err”}
{状态:“err”}
]);
聚合结果应如下所示:

{status:“err”,maxCons:3},
//(可选){状态:“suc”,maxCons:1},
//(可选){状态:“res”,maxCons:2}
实际上,如果
maxCons
计数器停止在3,就可以了,我需要知道
err
状态是否连续出现3次或更多次

一个解决方法:

我考虑在所有文档上添加一个增量,如下所示:

{状态:“err”,id:0},
{状态:“suc”,id:1},
{状态:“res”,id:2},
{状态:“res”,id:3},
{状态:“err”,id:4},
{状态:“err”,id:5},
{状态:“err”,id:6}
然后把它们分成0-2,1-3,2-4。。。 这将导致:

{\u id:0
res:[
{状态:“err”,id:0},
{状态:“suc”,id:1},
{状态:“res”,id:2}
]
},
{u id:1
res:[
{状态:“suc”,id:1},
{状态:“res”,id:2},
{状态:“res”,id:3},
]
},
{
_身份证号码:2
res:[
{状态:“res”,id:2},
{状态:“res”,id:3},
{状态:“err”,id:4},
]
} ...
有了这个,我可以计算出状态
err
以连续顺序出现的频率。
但是我不知道如何写这个
小组
阶段

将此视为一个问题的问题在于,没有将一个文档与另一个文档进行比较的实际概念,因为所有操作要么一次处理一个文档,要么将文档分组在一起

因此,查找“连续”条目需要一个“全局”变量空间,以便跨文档工作。聚合框架没有做到这一点,但问题可以通过以下方式解决:

简单地说,这将为当前的“状态”值发出一个“键”,同时保持“列表”和“计数器”的全局值,这些全局值正在跟踪连续的事件。列表将在此处建立,仅以
\u id
中的数值为例,但可以是任何内容:

    { "_id": "err", "values": { "list": [1], "count": 1 }}
    { "_id": "suc", "values": { "list": [2], "count": 1 }}
    { "_id": "res", "values": { "list": [3], "count": 1 }}
    { "_id": "res", "values": { "list": [3,4], "count": 2 }}
    { "_id": "err", "values": { "list": [5], "count": 1 }}
    { "_id": "err", "values": { "list": [5,6], "count": 2 }}
    { "_id": "err", "values": { "list": [5,6,7], "count":3 }}
这基本上就是映射器发出的信息。注意从那里的globals开始的构建

在reduce函数中,所有相同的键一起处理,或者至少在reducer在此工作时在同一个键的“组”中处理。因此,所有的reduce函数都是在具有最大计数的组中查找值,并在匹配索引处返回单数项

您得到的结果基本上是:

    { "_id": "err", "value": { "list": [5,6,7], "count":3 }}
    { "_id": "res", "value": { "list": [3,4], "count": 2 }}
    { "_id": "suc", "value": { "list": [2], "count": 1 }}
mapReduce以“键”顺序发出最终结果的位置

是的,JavaScript评估的运行速度比聚合框架稍微慢一点,但是如果没有在文档范围内跟踪全局变量的能力,那么这就是其他方法无法完成的事情

    { "_id": "err", "value": { "list": [5,6,7], "count":3 }}
    { "_id": "res", "value": { "list": [3,4], "count": 2 }}
    { "_id": "suc", "value": { "list": [2], "count": 1 }}