【发布时间】:2014-03-04 12:15:53
【问题描述】:
我想根据一个特定字段查找最大连续记录数。
找到基于字段的排序后我的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 的地方有两处。即
record with _id 3 - record with _id 4 (2 consecutive records)
和
record with _id 7 - record with _id 8 - record with _id 5 (3 consecutive records)
但是,我想要 mongo 查询搜索的最大连续数。即3。
有可能得到这样的结果吗?
我用谷歌搜索了一下,发现了一个类似的解决方案,在这里使用Map-Reduce https://stackoverflow.com/a/7408639/1120530。
我是 mongodb 新手,无法理解 map-reduce 文档,特别是如何在上述场景中应用它。
【问题讨论】:
-
您能否澄清您的意思是按特定关键字段排序时的“最连续记录”,还是您正在寻找自然的插入顺序。如果人们在提出问题时了解您的用例,这会有所帮助。这样可以避免您稍后说响应不是您想要的。
-
@NeilLunn:请检查我更新的问题。
-
你可以用javascript表达式来实现(注意会很慢)。据我所知,没有 mongo 原生查询。
-
这些真的有增量数字 _id 吗? _id 是排序键吗?我对太容易的事情持怀疑态度。
-
@NeilLunn:'updated_at' 是排序键,'_id' 不是增量数值。