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,按日期差异分组并获取小时的主要内容,如果未能解决你的问题,请参考以下文章