Mongodb,按 datediff 分组并获取小时

Mongodb, group by datediff and getting hour

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

我需要的是获取所有 "traitements" 用户的日期差异,但采用小时格式。 例如,如果特征开始于 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
    }
}]

这是一个简单的 "traitement" 文档:

    {"_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 管道操作,您可以在其中使用 [=15= 获取两个日期之间的差异] 运算符,然后使用 $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
}