यह $range
. के माध्यम से संभव है एक श्रेणी उत्पन्न करने और स्वयं देखने के लिए
कदम
$group
- न्यूनतम और अधिकतम तिथि को गतिशील रूप से खोजें, यदि आवश्यक हो तो हार्ड-कोड$project
-$range
उत्पन्न करें , न्यूनतम और अधिकतम के आधार पर, यदि आवश्यक हो तो हार्ड-कोड$unwind
- दस्तावेज़ के लिए सीमा खोलें$project
- जनरेट किए गए नंबर से तारीख जेनरेट करें$lookup
- तिथि के आधार पर संग्रह के साथ स्वयं जुड़ें$project
- यदि मैच में वापसी की संख्या पाई जाती है, तो 0. बदलें$ifNull
करने के लिए$cond
अगर मोंगो संस्करण 3.6 से कम है
कुल पाइपलाइन
db.t.aggregate(
[
{
$group : { _id : null, startDate : { "$min" : "$date" }, endDate : { "$max" : "$date" }}
},
{
$project : { _id : 0 , startDate : 1, genNo : { $range : [ { $add : [ {"$dayOfMonth" : "$startDate"}, -1 ] }, { $add : [ {"$dayOfMonth" : "$endDate"} , 1 ] } ] } }
},
{
$unwind : "$genNo"
},
{
$project : { genDate : { $add : [ "$startDate", { $multiply : [ "$genNo" , 86400000 ] } ] } }
},
{
$lookup : {
from : "t",
localField : "genDate",
foreignField : "date",
as : "out"
}
},
{
$project : { date : "$genDate", count : { $ifNull : [ { $arrayElemAt : ["$out.count", 0 ] }, 0 ] } }
}
]
)
संग्रह
> db.t.find()
{ "_id" : ObjectId("5a5d78d5423b9839ce07bd77"), "date" : ISODate("2018-01-01T00:00:00Z"), "count" : 3 }
{ "_id" : ObjectId("5a5d78d5423b9839ce07bd78"), "date" : ISODate("2018-01-04T00:00:00Z"), "count" : 5 }
>
एकत्रीकरण परिणाम
{ "date" : ISODate("2018-01-01T00:00:00Z"), "count" : 3 }
{ "date" : ISODate("2018-01-02T00:00:00Z"), "count" : 0 }
{ "date" : ISODate("2018-01-03T00:00:00Z"), "count" : 0 }
{ "date" : ISODate("2018-01-04T00:00:00Z"), "count" : 5 }
{ "date" : ISODate("2018-01-05T00:00:00Z"), "count" : 0 }
>