Mongodb,由约会和小时组成

时间:2015-03-27 10:46:39

标签: javascript mongodb coffeescript mongoose

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

  • 我有一个traitement模型,我有一个用户,
  • traitement模型具有开始日期和结束日期,均为日期格式,因此mongodb可以使用ISODate()

我需要的是获得用户对所有“traitements”的日期差异,但是以小时格式表示。 例如,如果在24/02/2015 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是一个未知的组操作符。

编辑: 我可以使用$减法但我不知道如何分组。你能救我吗?

这是我没有组的新代码:

 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)的SUM。

提前谢谢

1 个答案:

答案 0 :(得分:7)

根据我在您的问题中理解的内容(如果您的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
}