$week
として 0
の間の値を返すことができます および53
54
を期待していると思います 結果として0
のドキュメント またはdocumentCount
のゼロ以外の値 。これを実現するには、すべてのドキュメントを1つにまとめる必要があります( $グループ
-null
によるing )次に出力を生成します。
数値の範囲を生成するには、 $ range 演算子を使用すると、 $mapを使用して出力を生成できます。 a> 。ドキュメントの配列を複数のドキュメントに変換するには、 $くつろぐ 。
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
)は、1つのレベルのネスト(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
の入力を変更して、返される結果を簡単にカスタマイズできます ステージ。たとえば、input: [21, 22, 23, 24]
のような定数の配列を渡すことができます。 同様に。
編集:指定された日付の間の週を取得するには、$week
を使用できます 数値を取得するための開始日と終了日。