db.foos.aggregate(
[
{ $project : { day : {$substr: ["$TimeStamp", 0, 10] }}},
{ $group : { _id : "$day", number : { $sum : 1 }}},
{ $sort : { _id : 1 }}
]
)
Gruppera efter datum kan göras i två steg i aggregeringsramverket, ytterligare ett tredje steg behövs för att sortera resultatet, om sortering önskas:
$project
i kombination med$substr
tar de första 10 tecknen (ÅÅÅÅ:MM:DD) i ISODate-objektet från varje dokument (resultatet är en samling dokument med fälten "_id" och "day");$group
grupperar efter dag, lägger till (summerar) siffran 1 för varje matchande dokument;$sort
stigande med "_id", vilket är dagen från föregående aggregeringssteg - detta är valfritt om sorterat resultat önskas.
Denna lösning kan inte dra fördel av index som db.twitter.ensureIndex( { TimeStamp: 1 } )
, eftersom det transformerar ISODate-objektet till ett strängobjekt i farten. För stora samlingar (miljontals dokument) kan detta vara en prestandaflaskhals och mer sofistikerade metoder bör användas.