Như $ tuần
có thể trả về giá trị giữa 0
và 53
Tôi cho rằng bạn mong đợi 54
kết quả là tài liệu có 0
hoặc các giá trị khác 0 cho documentCount
. Để đạt được điều đó, bạn nên tập hợp tất cả tài liệu của mình thành một ( $ nhóm
-ing bởi null
) và sau đó tạo đầu ra.
Để tạo một dải số, bạn có thể sử dụng $ range toán tử và sau đó bạn có thể tạo đầu ra bằng cách sử dụng $ map . Để chuyển một mảng tài liệu thành nhiều tài liệu, bạn có thể sử dụng $ thư giãn .
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"
}
}
])
Sử dụng $ indexOfArray
để kiểm tra xem mảng tài liệu hiện tại có chứa tài liệu (-1 không) và $ arrayElemAt
để lấy tài liệu hiện có từ docs
. Bước cuối cùng ( $ ReplaceRoot
) chỉ để loại bỏ một cấp độ lồng nhau (docs
). Kết quả đầu ra:
{ "_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 }
Bạn có thể dễ dàng tùy chỉnh kết quả trả về bằng cách sửa đổi đầu vào của $map
sân khấu. Ví dụ:bạn có thể chuyển một mảng các khuyết điểm như input: [21, 22, 23, 24]
nữa.
CHỈNH SỬA:Để lấy các tuần giữa các ngày được chỉ định, bạn có thể sử dụng $week
cho ngày bắt đầu và ngày kết thúc để lấy số liệu.