草庐IT

mongodb 按分钟分组

coder 2023-11-06 原文

我有一张 table :

id   value   date
1      1     2014-08-10 10:00:00
1      2     2014-08-10 10:05:00
1      1     2014-08-10 12:00:00
1      1     2014-08-11 12:05:00
1      2     2014-08-11 12:06:00
2      2     2014-08-10 10:00:00
2      2     2014-08-11 10:05:00
2      1     2014-08-11 12:00:00
2      1     2014-08-20 12:05:00
2      2     2014-08-20 12:06:00

我想获取第一天每个 id 的总值(value)数。我可以使用以下命令在 MySQL 中执行此操作:

SELECT test.id, COUNT(CASE WHEN value=1 THEN 1 END) AS 'total_value_1',
                COUNT(CASE WHEN value=2 THEN 1 END) AS 'total_value_2'
FROM test,    
(SELECT id, date(min(date)) as firstDay
 FROM test
 GROUP BY id) AS temp
WHERE  test.id = temp.id AND date(test.date) = temp.firstDay
GROUP BY test.id;

结果是:

id total_value_1 total_value_2
1         2           1
2         0           1

我如何在 MongoDB 中执行此操作?

最佳答案

这可以通过使用 a collection of operators 的聚合框架来实现 在管道阶段定义和操作文档,这将为您提供所需的结果。您的第一个管道阶段是 $project运算符,您可以在其中转换您的值字段,以便在以后的管道阶段更容易操作。此操作的等效 SQL 是:

SELECT id, date, CASE WHEN value=1 THEN 1 END AS 'value_1',
                 CASE WHEN value=2 THEN 1 END AS 'value_2'
FROM test

下一个管道阶段使用 $group$project运算符计算日期字段上月份的最小日期和转换值字段上的总和聚合:

db.test.aggregate([
    {        
        "$project": {  
            "id": 1,            
            "date": 1,            
            "value_1": { "$cond": [{ "$eq": [ "$value", 1 ] }, 1, 0] },
            "value_2": { "$cond": [{ "$eq": [ "$value", 2 ] }, 1, 0] }
        }
    },
    {
        "$group": {
            "_id": {
                "id": "$id",
                "date": "$date"
            },
            "minimumDayofMonth": {
                "$min": { "$dayOfMonth": "$date"}
            },
            "total1" : {
                "$sum": "$value_1"
            },
            "total2" : {
                "$sum": "$value_2"
            }             
        }
    },
    {
        "$group": {
            "_id": {
                "id": "$_id.id",
                "day": "$minimumDayofMonth"
            }, 
            "firstDay": { "$min": "$minimumDayofMonth"  },            
            "total_value_1" : {
                "$sum": "$total1"
            },
            "total_value_2" : {
                "$sum": "$total2"
            }            
        }
    },
    {
        "$group": {
            "_id": "$_id.id",             
            "result": { "$first": "$$ROOT" }                
        }
    },
    {        
        "$project": {  
            "_id": 0,
            "id": "$_id",
            "total_value_1": "$result.total_value_1",
            "total_value_2": "$result.total_value_2"
        }
    }    
])

输出:

/* 0 */
{
    "result" : [ 
        {
            "id" : 2,
            "total_value_1" : 0,
            "total_value_2" : 1
        }, 
        {
            "id" : 1,
            "total_value_1" : 2,
            "total_value_2" : 1
        }
    ],
    "ok" : 1
}

关于mongodb 按分钟分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29509410/

有关mongodb 按分钟分组的更多相关文章

  1. ruby-on-rails - 按天对 Mongoid 对象进行分组 - 2

    在控制台中反复尝试之后,我想到了这种方法,可以按发生日期对类似activerecord的(Mongoid)对象进行分组。我不确定这是完成此任务的最佳方法,但它确实有效。有没有人有更好的建议,或者这是一个很好的方法?#eventsisanarrayofactiverecord-likeobjectsthatincludeatimeattributeevents.map{|event|#converteventsarrayintoanarrayofhasheswiththedayofthemonthandtheevent{:number=>event.time.day,:event=>ev

  2. ruby - 在 Ruby 中创建按公共(public)键值分组的新哈希 - 2

    假设我有一个在Ruby中看起来像这样的哈希:{:ie0=>"Hi",:ex0=>"Hey",:eg0=>"Howdy",:ie1=>"Hello",:ex1=>"Greetings",:eg1=>"Goodday"}有什么好的方法可以将它变成如下内容:{"0"=>{"ie"=>"Hi","ex"=>"Hey","eg"=>"Howdy"},"1"=>{"ie"=>"Hello","ex"=>"Greetings","eg"=>"Goodday"}} 最佳答案 您要求一个好的方法来做到这一点,所以答案是:一种您或同事可以在六个月后理解

  3. arrays - 如何在下面的示例中将两个值数组分组为 n 个值数组? - 2

    我已经有很多两个值数组,例如下面的例子ary=[[1,2],[2,3],[1,3],[4,5],[5,6],[4,7],[7,8],[4,8]]我想把它们分组到[1,2,3],[4,5],[5,6],[4,7,8]因为意思是1和2有关系,2和3有关系,1和3有关系,所以1,2,3都有关系我如何通过ruby​​库或任何算法来做到这一点? 最佳答案 这是基本Bron–Kerboschalgorithm的Ruby实现:classGraphdefinitialize(edges)@edges=edgesenddeffind_maximum_

  4. ruby - 如何将相同的相邻数字分组 - 2

    如果至少有两个相邻的数字相同,格式为,我需要打包.这是我的输入:[2,2,2,3,4,3,3,2,4,4,5]以及预期的输出:"2:3,3,4,3:2,2,4:2,5"到目前为止我试过:a=[1,1,1,2,2,3,2,3,4,4,5]a.each_cons(2).any?do|s,t|ifs==t如果相等,也许可以尝试计数器,但那是行不通的。 最佳答案 您可以使用Enumerable#chunk_while(如果你使用的是Ruby>=2.3):a.chunk_while{|a,b|a==b}.flat_map{|chunk|chu

  5. ruby - 如何在 Ruby 中将数字分组到不同的桶中 - 2

    我有一个文件,每一行都有数字:010110101311010113114311010431420我想要一个包含每个数字出现次数的散列,在这种情况下:{0101=>2,1010=>2,1311=>2,431=>2,420=>1}我该怎么做? 最佳答案 简单的一行代码,给定一个数组items:items.inject(Hash.new(0)){|hash,item|hash[item]+=1;hash}工作原理:Hash.new(0)创建一个新的Hash,其中访问未定义的键返回0。inject(foo)使用给定的block遍历数组。对于

  6. 三分钟集成 TapTap 防沉迷 SDK(Unity 版) - 2

    三分钟集成Tap防沉迷SDK(Unity版)一、SDK介绍基于国家对上线所有游戏必须增加防沉迷功能的政策下,TapTap推出防沉迷SDK,供游戏开发者进行接入;允许未成年用户在周五、六、日以及法定节假日晚上8:00-9:00进行游戏,防沉谜时间段进入游戏会弹窗进行提示!开发环境要求:Unity2019.4或更高版本iOS10或更高版本Android5.0(APIlevel21)或更高版本🔗Unity集成Demo参考链接🔗UnityTapSDK功能体验APK下载链接二、集成前准备1.创建应用进入开发者后台,按照提示开始创建应用;2.开通服务在使用TDS实名认证和防沉迷服务之前,需要在上面创建的应

  7. ruby-on-rails - 应用程序显示错误的小时和分钟 - 2

    起初:那不是错误区域的问题。在irb和数据库中,一切都很好。当我想在我的View中显示日期(created_at、updated_at和所有由我自己在每个模型中定义的日期)时,就会出现问题。我试图在application.rb中设置时区并从初始化程序中删除时间格式,但这并没有解决我的问题。Annotategem生成的架构信息:#created_at:datetime#updated_at:datetime#publish_at:datetime来自irb:1.9.2-p290:004>Time.zone=>(GMT+00:00)UTC1.9.2-p290:005>Time.zone.n

  8. ruby-on-rails - Ruby On Rails Mongoid 分组依据 - 2

    对于按日期分组,我使用了group_by方法。Example:Product.all.group_by{|d|d.created_at}#returnHash但是kaminari不支持Hash。我使用Mongoid,我需要通过页面导航(kaminari)按日期分组。怎么做到的? 最佳答案 Kaminari只支持数组分页例如Kaminari.paginate_array(an_array).page(1).per(10)group_by不是mongoid方法,它是Array的方法,它是对内存中的所有数据进行分组。为了使用mongoid

  9. ruby - 如何让 Ruby 每 10 分钟运行一次任务? - 2

    我想每10分钟执行一次cron作业,但我的系统只执行1小时。所以我正在寻找一种方法来做到这一点。我看过Timer和sleep但我不确定如何执行此操作,甚至不知道如何实现此操作。 最佳答案 看看http://rufus.rubyforge.org/rufus-scheduler/rufus-scheduler是一个用于调度代码片段(作业)的Rubygem。它了解在特定时间、在特定时间、每x次或仅通过CRON语句运行作业。rufus-scheduler不能替代cron/at,因为它在Ruby内部运行。

  10. ruby - 按相似性对字符串进行分组 - 2

    我有一个字符串数组,数量不多(可能几百个)但通常很长(几百个字符)。这些字符串通常是无意义的,并且彼此不同。但是在一组这样的字符串中,可能300个中有5个具有很大的相似性。事实上,它们是相同的字符串,不同的是格式、标点符号和一些单词..我怎样才能算出那组字符串?顺便说一句,我正在用ruby​​编写,但如果没有别的,伪代码算法就可以了。谢谢 最佳答案 假设您不担心每个单词的拼写错误或其他错误,您可以执行以下操作:构建一个倒排索引,它基本上是一个以单词为键的散列,指向包含该单词的字符串的指针列表(如何处理重复出现由您决定)。要确定与给定

随机推荐