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

g

我想找到基于一个特定字段的最大连续记录数。

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以连续的方式出现。IE

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

有可能得到这样的结果吗?

我在Google上进行了搜索,发现了Map-Reduce在此处使用https://stackoverflow.com/a/7408639/1120530的一些类似解决方案

我是mongodb的新手,无法理解map-reduce文档,尤其是在上述情况下如何应用它。

尼尔·伦恩

您可以执行此mapReduce操作。

首先,映射器:

var mapper = function () {


    if ( this.flag == true ) {
        totalCount++;
    } else {
        totalCount = 0;
    }

    if ( totalCount != 0 ) {
        emit (
        counter,
        {  _id: this._id, totalCount: totalCount }
    );
    } else {
      counter++;
    }

};

这将对true标记中显示该的总次数进行连续计数如果该计数大于1,则我们发出该值,其中也包含document _id当标志为时,用于密钥的另一个计数器将递增false,以使匹配具有分组“密钥”。

然后减速器:

var reducer = function ( key, values ) {

    var result = { docs: [] };

    values.forEach(function(value) {
        result.docs.push(value._id);
        result.totalCount = value.totalCount;
    });

    return result;

};

只需将_id值与totalCount一起到结果数组中即可。

然后运行:

db.people.mapReduce(
    mapper,
    reducer,
   { 
       "out": { "inline": 1 }, 
       "scope": { 
           "totalCount": 0, 
           "counter": 0 
       }, 
       "sort": { "updated_at": 1 } 
   }
)

因此,使用mapperreducer函数,然后定义“作用域”中使用的全局变量,并传递updated_at日期所需的“排序” 结果如下:

{
    "results" : [
        {
            "_id" : 1,
            "value" : {
                "docs" : [
                     3,
                     4
                 ],
                 "totalCount" : 2
            }
        },
        {
            "_id" : 2,
            "value" : {
            "docs" : [
                7,
                8,
                5
             ],
             "totalCount" : 3
             }
        }
    ],
    "timeMillis" : 2,
    "counts" : {
            "input" : 7,
            "emit" : 5,
            "reduce" : 2,
            "output" : 2
    },
    "ok" : 1,
}

当然,您可以跳过该totalCount变量,而只使用数组长度,这是相同的。但是,由于无论如何都想使用该计数器,所以它刚刚被添加进来。但这就是原理。

是的,这是适合mapReduce的问题,现在您有一个例子。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

计算一个字符串中的最大连续RE组

根据另一个字段的值在MongoDB中投影一个字段

根据条件更新一个字段的许多 mongoDB 记录

在一个字段中按数组查找mongodb中的文档?

使用SQL根据记录中的另一个字段检索组合记录的字段值

如何根据另一个字段中的值在一个字段中查找和替换?

mgo,mongodb:从嵌入式结构中查找与一个字段匹配的文档

如何在另一个字段的任何行中查找具有一个字段内容的MySQL记录

如何根据另一个字段在特定时间范围内查找记录

如何查询一个字段大于另一个字段x天的记录?

从Mongodb查询中仅提取一个字段

MySQL查询来查找一个字段出现在另一个字段中

根据MongoDB文档中的另一个字段更新一个字段(在Node.js中使用Mongoose)

根据MongoDB中的另一个字段有选择地返回一个字段

查找来自一个字段的值不为null且不在另一个字段中的MongoDB文档

从MongoDB中仅选择一个字段

mongodb $ inc数组中的一个字段

Mongodb在一个字段上查询取决于另一个字段

在Elasticsearch中查询一个字段不等于另一个字段

同一个表的所有记录由一个字段关联但由另一个字段查询 - sqlserver

根据另一个字段更新一个字段

查找一个字段不相等的重复记录

如何在SQL查询的一个字段中求和多个字段?

C# Mongodb:如何在嵌套的文档列表中查找并选择一个字段

如何使用 nodejs 通过 objectId 和 mongodb 中的另一个字段查找文档?

在弹性搜索中查找连续有一个字符的次数

MongoDB聚合查找仅返回数组的一个字段

通过另一个字段mongodb查找不同的值组

当一个字段被请求为另一字段的根字段时,如何在查询中获取mongodb的所有子字段?