Som $week
kan returnera ett värde mellan 0
och 53
Jag antar att du förväntar dig 54
dokument som ett resultat med 0
eller icke-nollvärden för documentCount
. För att uppnå detta bör du samla alla dina dokument i ett ($ grupp
-ing av null
) och generera sedan utdata.
För att generera ett antal nummer kan du använda $range operatorn och sedan kan du generera utdata med $map . För att omvandla en mängd dokument till flera dokument kan du använda $ varva ner .
db.collectionName.aggregate([
//where query
{ "$match": { $and:[{CreatedOn:{$lte:ISODate("2018-07-14T13:59:08.266+05:30")}},{CreatedOn:{$gte:ISODate("2018-06-10T13:59:08.266+05:30")}}] } },
//distinct column
{
"$group": {
_id: {$week: '$CreatedOn'},
documentCount: {$sum: 1}
}
},
{
$group: {
_id: null,
docs: { $push: "$$ROOT" }
}
},
{
$project: {
docs: {
$map: {
input: { $range: [ {$week:ISODate("2018-06-10T13:59:08.266+05:30")}, {$week:ISODate("2018-07-14T13:59:08.266+05:30")}]},
as: "weekNumber",
in: {
$let: {
vars: { index: { $indexOfArray: [ "$docs._id", "$$weekNumber" ] } },
in: {
$cond: {
if: { $eq: [ "$$index", -1 ] },
then: { _id: "$$weekNumber", documentCount: 0 },
else: { $arrayElemAt: [ "$docs", "$$index" ] }
}
}
}
}
}
}
}
},
{
$unwind: "$docs"
},
{
$replaceRoot: {
newRoot: "$docs"
}
}
])
Använder $indexOfArray
för att kontrollera om array av aktuella dokument innehåller dokumentet (-1 annars) och $arrayElemAt
för att hämta befintligt dokument från docs
. Sista steget ($replaceRoot
) är bara att bli av med en nivå av kapsling (docs
). Utgångar:
{ "_id" : 0, "documentCount" : 0 }
{ "_id" : 1, "documentCount" : 0 }
{ "_id" : 2, "documentCount" : 0 }
...
{ "_id" : 22, "documentCount" : 0 }
{ "_id" : 23, "documentCount" : 2 }
{ "_id" : 24, "documentCount" : 9 }
{ "_id" : 25, "documentCount" : 1 }
{ "_id" : 26, "documentCount" : 1 }
{ "_id" : 27, "documentCount" : 0 }
...
{ "_id" : 52, "documentCount" : 0 }
{ "_id" : 53, "documentCount" : 0 }
Du kan enkelt anpassa returnerade resultat genom att ändra inmatningen av $map
skede. Till exempel kan du skicka en array av konster som input: [21, 22, 23, 24]
likaså.
EDIT:För att få veckorna mellan angivna datum kan du använda $week
för start- och slutdatum för att få siffrorna.