MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Mongodb, gruppiere nach datediff und bekomme die Stunde

Nach dem, was ich in Ihrer Frage verstanden habe (Sie müssen tatsächlich ein paar Beispieldokumente mit Ihrem Schema bereitstellen), wenn Ihr Traitement model hat beispielsweise folgende Struktur:

/* 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")
}

Ihr Aggregationsframework hätte ein einzelnes $project Pipeline-Vorgang, bei dem Sie die Differenz zwischen den beiden Daten mithilfe von $subtract erhalten -Operator und wandeln Sie dann diese Datumsdifferenz in Millisekunden in Stunden um, indem Sie $divide verwenden Operator. Die letzte Stufe in Ihrer Pipeline wird die Verwendung der $group sein -Operator zum Gruppieren der Dokumente aus der vorherigen Pipeline und $sum die Stunden im Datumsunterschied:

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

Ergebnisse:

/* 0 */
{
    "result" : [ 
        {
            "_id" : "jkl",
            "total" : 8.5
        }, 
        {
            "_id" : "abc",
            "total" : 5
        }
    ],
    "ok" : 1
}