Javascript Mongodb,按datediff分组并获取小时数

Javascript Mongodb,按datediff分组并获取小时数,javascript,mongodb,coffeescript,mongoose,Javascript,Mongodb,Coffeescript,Mongoose,我实际上正在开发一个应用程序,我需要从我的数据库中获取一些信息: 我有一个叛逆模型,其中我有一个用户 traitement模型有开始日期和结束日期,两者都是日期格式,因此mongodb可以使用ISODate() 我需要的是获得用户提供的所有datedifference的“traitements”,但格式为小时。 例如,如果训练开始于2015年2月24日08:00:00,结束于2015年2月24日10:00:00,我需要得到“2”小时 以下是我实际拥有的: @TraitementNettoya

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

  • 我有一个叛逆模型,其中我有一个用户
  • traitement模型有开始日期和结束日期,两者都是日期格式,因此mongodb可以使用ISODate()
我需要的是获得用户提供的所有datedifference的“traitements”,但格式为小时。 例如,如果训练开始于2015年2月24日08:00:00,结束于2015年2月24日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)的总和


如果您的
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)总和,以秒或毫秒为单位。谢谢你的帮助help@Skahrz你能出示一份样本文件和你的预期结果吗?从你的问题来看,如果没有明确的例子,它会变得有点不清楚。我编辑了我的帖子:-),你的答案更接近,但不是很好。所有减法运算的总和丢失:-/@Skahrz-Aha,明白了!请参阅我的修订答案,其中考虑了金额。基本上,您只需在处理
$sum
:)的
$project
之后添加另一个
$group
管道即可