Mongodb,由约会和小时组成

mfr*_*het 4 javascript mongoose mongodb coffeescript

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

  • 我有一个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
      )
Run Code Online (Sandbox Code Playgroud)

此请求不起作用,并告诉我$ subtract是一个未知的组操作符.

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

这是我没有组的新代码:

 Traitement.aggregate([
        {$project: {total: {$subtract: ['$dateSortie', '$dateEntre']}}},
        {$sort: {_id: 1}}
      ]).exec((err, res)=>
        console.log res
      )
Run Code Online (Sandbox Code Playgroud)

最后一部分是按用户属性对其进行分组,我不知道如何使其工作: - /

编辑2:

我需要的文件:

[{
    "_id": {
        "user": {
            "_id": "5512a66db54f879c2887411f",
            "userLastname": "Toto",
            "userFirstname": "Toto"
        },
        "total": 17824
    }
},
{
    "_id": {
        "user": {
            "_id": "551408741ad3b66c19978e9a",
            "userLastname": "Foo",
            "userFirstname": "Foo"
        },
        "total": 939
    }
}]
Run Code Online (Sandbox Code Playgroud)

还有一个简单的"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
}
Run Code Online (Sandbox Code Playgroud)

我真正需要的是:

按用户分组的所有(dateSortie-dateEntre)的SUM.

提前谢谢

chr*_*dam 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")
}
Run Code Online (Sandbox Code Playgroud)

您的聚合框架将具有单个$project管道操作,您可以使用$subtract运算符获取两个日期之间的差异,然后使用运算符将该日期差异(以毫秒为单位)转换为小时$divide.管道的最后一个阶段是使用$group运算符对上一个管道中的文档和$sum日期差异小时进行分组:

Traitement.aggregate([ 
    { 
        $project: { 
            user: 1,             
            dateDifference: { 
                $divide: [{ 
                    $subtract: [ "$dateSortie", "$dateEntre" ]
                    }, 1000*60*60
                ] 
            }
         }
    },
    { 
        $group: { 
            _id: "$user",             
            total : { 
                $sum : "$dateDifference"
            }
        }
    } 
])
Run Code Online (Sandbox Code Playgroud)

结果:

/* 0 */
{
    "result" : [ 
        {
            "_id" : "jkl",
            "total" : 8.5
        }, 
        {
            "_id" : "abc",
            "total" : 5
        }
    ],
    "ok" : 1
}
Run Code Online (Sandbox Code Playgroud)