sql >> Database teknologi >  >> NoSQL >> MongoDB

Mongodb, gruppe efter datediff og få time

Ud fra hvad jeg har forstået i dit spørgsmål (du skal faktisk levere et par eksempler på dokumenter med dit skema), hvis din Traitement modellen har f.eks. følgende 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")
}

Din aggregeringsramme ville have et enkelt $project pipeline operation, hvor du får forskellen mellem de to datoer ved at bruge $subtract operator og transformer derefter datoforskellen i millisekunder til timer ved at bruge $divide operatør. Den sidste fase i din pipeline vil være at bruge $group operatør for at gruppere dokumenterne fra den forrige pipeline og $sum timerne i datoforskel:

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

Resultater:

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



  1. Opdater indlejret dokument i mongodb ved hjælp af C#

  2. Hvordan undgår man Redis-opkald i Lua-scriptbegrænsninger?

  3. mongodb:hvordan man opdaterer array-element efter indeksnummer

  4. Indeksering af parallelle arrays i Mongodb