Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.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
根据Mongodb查询中的一个字段查找最大连续记录数_Mongodb_Mapreduce_Mongoid - Fatal编程技术网

根据Mongodb查询中的一个字段查找最大连续记录数

根据Mongodb查询中的一个字段查找最大连续记录数,mongodb,mapreduce,mongoid,Mongodb,Mapreduce,Mongoid,我想根据一个特定字段查找最大连续记录数 我的db.people查找基于字段的排序后的集合是: > db.people.find().sort({ updated_at: 1}) { "_id" : 1, "name" : "aaa", "flag" : true, "updated_at" : ISODate("2014-02-07T08:42:48.688Z") } { "_id" : 2, "name" : "bbb", "flag" : false, "updated_at" : I

我想根据一个特定字段查找最大连续记录数

我的
db.people
查找基于字段的排序后的集合是:

> db.people.find().sort({ updated_at: 1})
{ "_id" : 1, "name" : "aaa", "flag" : true, "updated_at" : ISODate("2014-02-07T08:42:48.688Z") }
{ "_id" : 2, "name" : "bbb", "flag" : false, "updated_at" : ISODate("2014-02-07T08:43:10Z") }
{ "_id" : 3, "name" : "ccc", "flag" : true, "updated_at" : ISODate("2014-02-07T08:43:40.660Z") }
{ "_id" : 4, "name" : "ddd", "flag" : true, "updated_at" : ISODate("2014-02-07T08:43:51.567Z") }
{ "_id" : 6, "name" : "fff", "flag" : false, "updated_at" : ISODate("2014-02-07T08:44:23.713Z") }
{ "_id" : 7, "name" : "ggg", "flag" : true, "updated_at" : ISODate("2014-02-07T08:44:44.639Z") }
{ "_id" : 8, "name" : "hhh", "flag" : true, "updated_at" : ISODate("2014-02-07T08:44:51.415Z") }
{ "_id" : 5, "name" : "eee", "flag" : true, "updated_at" : ISODate("2014-02-07T08:55:24.917Z") }
在上述记录中,有两个位置连续出现
flag
属性值
true
。i、 e

record with _id 3 - record with _id 4   (2 consecutive records)

但是,我需要mongo查询搜索的最大连续数。i、 e
3

有可能得到这样的结果吗

我在谷歌上搜索了一下,找到了一个类似的解决方案


我是mongodb新手,无法理解
map reduce
文档,特别是如何在上述场景中应用它。

您可以执行此mapReduce操作

首先,地图绘制者:

var映射器=函数(){
if(this.flag==true){
totalCount++;
}否则{
totalCount=0;
}
如果(totalCount!=0){
散发(
柜台
{{u id:this.\u id,totalCount:totalCount}
);
}否则{
计数器++;
}
};
它保存在标志中看到
true
值的总次数的运行计数。如果该计数大于1,则我们发出该值的值,该值还包含文档
\u id
。当标志为
false
时,用于键的另一个计数器将递增,以便为匹配项提供分组“键”

然后,减速器:

var reducer=函数(键、值){
var result={docs:[]};
values.forEach(函数(值){
result.docs.push(value.\u id);
result.totalCount=value.totalCount;
});
返回结果;
};
只需将
\u id
值与totalCount一起推送到结果数组中即可

然后运行:

db.people.mapReduce(
制图员,
减速器,
{ 
“out”:{“inline”:1},
“范围”:{
“totalCount”:0,
“计数器”:0
}, 
“排序”:{“更新位置”:1}
}
)
因此,使用
mapper
reducer
函数,我们然后定义“scope”中使用的全局变量,并传入
更新日期所需的“sort”。结果如下:

{
“结果”:[
{
“_id”:1,
“价值”:{
“文件”:[
3.
4.
],
“总数”:2
}
},
{
“_id”:2,
“价值”:{
“文件”:[
7.
8.
5.
],
“总数”:3
}
}
],
“timeMillis”:2,
“计数”:{
“输入”:7,
“发射”:5,
“减少”:2,
“产出”:2
},
“好”:1,
}
当然,您可以跳过
totalCount
变量,只使用相同的数组长度。但既然你想用那个计数器,它就被加进去了。但这是原则


是的,这是一个适用于mapReduce的问题,现在您有了一个示例。

您能否澄清,当按特定键字段排序时,您指的是“大多数连续记录”,还是指插入的自然顺序。如果人们在提问时理解您的用例,这会有所帮助。这避免了您以后说响应不完全是您想要的。@NeilLunn:请检查我更新的问题。您可以使用javascript表达式实现它(注意,它会很慢)。据我所知,没有mongo原生查询。这些查询真的有增量数字标识吗?那么_id是排序键吗?我对太简单的事情持怀疑态度。@NeilLunn:“updated_at”是排序键,“\u id”不是增量数值。谢谢你的回答。@NeilLunn,回答得好,你在哪里?
record with _id 7 - record with _id 8 - record with _id 5  (3 consecutive records)