Като $week
може да върне стойност между 0
и 53
Предполагам, че очаквате 54
документи като резултат с 0
или ненулеви стойности за documentCount
. За да постигнете това, трябва да съберете всичките си документи в едно ($ група
-ing от null
) и след това генерирайте изхода.
За да генерирате диапазон от числа, можете да използвате $range оператор и след това можете да генерирате изхода, като използвате $map . За да трансформирате масив от документи в множество документи, можете да използвате $ размотавам .
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"
}
}
])
Използване на $indexOfArray
за да проверите дали масивът от текущи документи съдържа документа (-1 в противен случай) и $arrayElemAt
за да получите съществуващ документ от docs
. Последна стъпка ($replaceRoot
) е просто да се отървете от едно ниво на влагане (docs
). Изходи:
{ "_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 }
Можете лесно да персонализирате върнатите резултати, като промените входа на $map
сцена. Например можете да подадете масив от const като input: [21, 22, 23, 24]
както и.
РЕДАКТИРАНЕ:За да получите седмиците между посочените дати, можете да използвате $week
за начална и крайна дата, за да получите числата.