Mongodb,按日期差异分组并获取小时

Posted

技术标签:

【中文标题】Mongodb,按日期差异分组并获取小时【英文标题】:Mongodb, group by datediff and getting hour 【发布时间】:2015-05-31 16:10:24 【问题描述】:

我实际上正在开发一个应用程序,我需要从我的数据库中获取一些信息:

我有一个特征模型,其中有一个用户, 特征模型有开始日期和结束日期,都是Date格式,所以mongodb可以使用ISODate()

我需要的是获取用户的所有“特征”以获得日期差异,但以小时格式。 例如,如果特征从 24/02/2015 08:00:00 开始并在 24/02/2015 10:00:00 结束,我需要获得“2”小时。

这是我实际拥有的:

@TraitementNettoyage.aggregate([
        $group: '_id': user: '$user', time: '$subtract': ['$dateSortie', '$dateEntre'],
        $sort: _id: 1
      ]).exec((err, res)=>
        console.log res
      )

这个请求不起作用,并告诉我 $subtract 是一个未知的组运算符。

编辑: 我可以使用 $subtract 但我不知道如何对其进行分组。你能帮帮我吗?

这是我没有分组的新代码:

 Traitement.aggregate([
        $project: total: $subtract: ['$dateSortie', '$dateEntre'],
        $sort: _id: 1
      ]).exec((err, res)=>
        console.log res
      )

最后一部分是按用户属性分组,我不知道如何使它工作:-/

编辑 2:

一份我需要的文件:

[
    "_id": 
        "user": 
            "_id": "5512a66db54f879c2887411f",
            "userLastname": "Toto",
            "userFirstname": "Toto"
        ,
        "total": 17824
    
,

    "_id": 
        "user": 
            "_id": "551408741ad3b66c19978e9a",
            "userLastname": "Foo",
            "userFirstname": "Foo"
        ,
        "total": 939
    
]

这是一个简单的“特征”文件:

    "_id" : ObjectId("55153711eba735e4311f92a0"),
                    "dateEntre" : ISODate("2015-03-27T10:55:13.069Z"),
                    "dateSortie" : ISODate("2015-03-27T10:55:18.018Z"),
                    "user" : ObjectId("5512a66db54f879c2887411f"),
                    "__v" : 0

我真正需要的是:

按用户分组的所有 (dateSortie-dateEntre) 的总和。

感谢提前

【问题讨论】:

【参考方案1】:

如果您的 Traitement 模型具有以下结构,例如,根据我在您的问题中的理解(您实际上需要为您的架构提供几个示例文档):

/* 0 */

    "_id" : 1,
    "user" : "abc",
    "dateEntre" : ISODate("2014-03-01T08:00:00.000Z"),
    "dateSortie" : ISODate("2014-03-01T13:00:00.000Z")


/* 1 */

    "_id" : 2,
    "user" : "jkl",
    "dateEntre" : ISODate("2014-03-01T08:00:00.000Z"),
    "dateSortie" : ISODate("2014-03-01T10:30:00.000Z")

/* 2 */

    "_id" : 3,
    "user" : "jkl",
    "dateEntre" : ISODate("2014-03-01T12:00:00.000Z"),
    "dateSortie" : ISODate("2014-03-01T18:00:00.000Z")

您的聚合框架将有一个 $project 管道操作,您可以在其中使用 $subtract 运算符获取两个日期之间的差异,然后转换该日期使用 $divide 运算符,以毫秒为单位。管道的最后一个阶段是使用 $group 运算符对上一个管道中的文档和 $sum 日期差异小时数进行分组:

Traitement.aggregate([ 
     
        $project:  
            user: 1,             
            dateDifference:  
                $divide: [ 
                    $subtract: [ "$dateSortie", "$dateEntre" ]
                    , 1000*60*60
                ] 
            
         
    ,
     
        $group:  
            _id: "$user",             
            total :  
                $sum : "$dateDifference"
            
        
     
])

结果:

/* 0 */

    "result" : [ 
        
            "_id" : "jkl",
            "total" : 8.5
        , 
        
            "_id" : "abc",
            "total" : 5
        
    ],
    "ok" : 1

【讨论】:

事实上,这并不是我所需要的。我需要的是用户通过时间做出一些“特征”。因此,按用户分组的 (dateEntre - dateSortie ) 的总和,以秒或毫秒为单位。感谢您的帮助 @Skahrz 您能否展示一个示例文档以及您的预期结果?从你的问题来看,如果没有明确的例子,它会变得有点不清楚。 我编辑我的帖子 :-),您的答案更接近,但并不完全好。缺少所有减法运算的 SUM :-/ @Skahrz 啊哈,明白了!请参阅我修改后的答案,其中考虑了总和。基本上你只需要在处理$sum$project 之后添加另一个$group 管道:)

以上是关于Mongodb,按日期差异分组并获取小时的主要内容,如果未能解决你的问题,请参考以下文章

你如何从 Mongo 日期字段中获取 DayHours?

如何在 MongoDB 中按日期分组

Mongodb 聚合 - 今天按小时分组

如何按特定日期范围(例如小时、日、月)对数据进行分组?

Mongodb - 在一小时内按日期/时间获取不同的值

Mongodb:按元素分组并根据条件显示子文档计数并按日期对文档进行排序