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()
@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
管道即可