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

Mongodb, group by datediff and getting hour

本文关键字:获取 小时 日期 Mongodb      更新时间:2023-09-26

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

  • 我有一个培训模型,其中有一个用户
  • 训练模型有开始日期和结束日期,都是date格式,所以mongodb可以使用ISODate()

我需要的是由用户获得日期差异的所有"培训",但以小时为格式。例如,如果培训开始于2015年2月24日08:00:00,结束于2015年02月24日10:00:00,则我需要"2"小时。

以下是我实际拥有的:

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

这个请求不起作用,告诉我$减法是一个未知的群运算符。

编辑:我会用$减法,但我不知道如何分组。你能帮我吗?

这是我的无组新代码:

 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)的总和。

T高级的银行

根据我在你的问题中所理解的(你实际上需要提供一对带有模式的文档样本),如果你的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
}