डिफ़ॉल्ट मान वापस करने के लिए आपको कुछ अतिरिक्त चरणों की आवश्यकता है। सबसे पहले आपको $group
. का उपयोग करना होगा _id
. के साथ null
पर सेट करें एक दस्तावेज़ में सभी परिणाम एकत्र करने के लिए। फिर आप इनपुट के रूप में दिनों की एक सरणी के साथ $map का उपयोग कर सकते हैं। उसके अंदर $map
आप $indexOfArray का उपयोग यह पता लगाने के लिए कर सकते हैं कि क्या वह तिथि आपके वर्तमान परिणाम सेट में मौजूद है। यदि हाँ (index != -1
) तो आप उस मान को वापस कर सकते हैं, अन्यथा आपको डिफ़ॉल्ट उप-दस्तावेज़ को views
. के साथ वापस करने की आवश्यकता है 0
. पर सेट करें . फिर आप दस्तावेज़ों की सूची वापस पाने के लिए $unwind और नेस्टेड stats
को बढ़ावा देने के लिए $replaceRoot का उपयोग कर सकते हैं एक शीर्ष स्तर तक।
ProductView.aggregate([
{ $match: { productId: '5b8c0f3204a10228b00a1745' } },
{ $project: { day: { $substr: ["$createdAt", 0, 10] } } },
{
$group: {
_id: "$day",
count: { $sum: 1 },
time: { $avg: "$createdAt" },
}
},
{ $sort: { _id: 1 } },
{
$project: {
date: '$_id',
views: '$count',
},
},
{
$group: {
_id: null,
stats: { $push: "$$ROOT" }
}
},
{
$project: {
stats: {
$map: {
input: [ "2018-09-01", "2018-09-02", "2018-09-03", "2018-09-04", "2018-09-05" ],
as: "date",
in: {
$let: {
vars: { dateIndex: { "$indexOfArray": [ "$stats._id", "$$date" ] } },
in: {
$cond: {
if: { $ne: [ "$$dateIndex", -1 ] },
then: { $arrayElemAt: [ "$stats", "$$dateIndex" ] },
else: { _id: "$$date", date: "$$date", views: 0 }
}
}
}
}
}
}
}
},
{
$unwind: "$stats"
},
{
$replaceRoot: {
newRoot: "$stats"
}
}
]).exec((err, result) => ...)
आप साधारण लूप का उपयोग करके अपने एप्लिकेशन लॉजिक में तिथियों की एक स्थिर सूची तैयार कर सकते हैं। मेरा मानना है कि यह मोंगोडीबी में भी संभव है ($ रेंज का उपयोग करके) लेकिन यह इस एकत्रीकरण पाइपलाइन को जटिल बना सकता है। मुझे बताएं कि क्या आप इसके साथ ठीक हैं या आप MongoDB में तिथियों की उस सरणी को उत्पन्न करने का प्रयास करना चाहते हैं।