बेवकूफ एकत्रीकरण तरकीबों . की श्रेणी में आते हैं एक छोटी सी तकनीक है जिसे अक्सर अनदेखा कर दिया जाता है।
इस दस्तावेज़ के लिए अद्वितीय पहचानकर्ता होने के नाते, दस्तावेज़ _id के चारों ओर समूहीकरण करने वाली क्वेरी। तो सोचने का मुख्य बिंदु है संपूर्ण दस्तावेज़ वास्तव में पहले से ही एक विशिष्ट पहचानकर्ता है। इसलिए केवल _id कुंजी को छिपाने के बजाय, संपूर्ण दस्तावेज़ का उपयोग करें।
{$project: {
_id: { _id: "$_id", name: "$name", forms: "$forms" }, forms: "$forms"}
},
जहां यह कुछ भी किया जाता है जो _id द्वारा लुढ़काया जाता है, दस्तावेज़ को उसके मूल रूप में रखता है। अन्य सभी एकत्रीकरण चरणों के अंत में, अंतिम $प्रोजेक्ट . जारी करें वास्तविक मूल दस्तावेज़ प्रपत्र को पुनर्स्थापित करने के लिए:
{$project: { _id: "$_id._id", name: "$_id.name", forms: "$_id.forms"}}
फिर आपके पास फ़िल्टर किए गए परिणाम होंगे जो आप चाहते हैं। उन्नत फ़िल्टरिंग के साथ उपयोग किए जाने पर यह तकनीक बहुत उपयोगी हो सकती है, जैसे कि इस क्वेरी के मामले में, क्योंकि यह अतिरिक्त खोज जारी करने की आवश्यकता को हटा देती है सभी परिणामों पर।
साथ ही, ऐसे मामले में जहां आप जानते हैं कि आप केवल उन परिणामों के समूह की तलाश कर रहे हैं जो कुछ निश्चित शर्तों से मेल खाने वाले हैं, एक $मिलान का उपयोग करें ऑपरेटर के रूप में प्रथम एकत्रीकरण पाइपलाइन का चरण। यह न केवल कार्यशील सेट आकार को कम करने में उपयोगी है, बल्कि यह केवल . भी है वह चरण जिस पर आप अनुक्रमणिका . का उपयोग कर सकते हैं और जहां आप क्वेरी के प्रदर्शन को महत्वपूर्ण रूप से बढ़ा सकते हैं।
पूरी प्रक्रिया एक साथ:
db.forms.aggregate([
{$match: { "forms.status": "closed" } },
{$project: {
_id: { _id: "$_id", name: "$name", forms: "$forms" }, forms: "$forms"}
},
{$unwind: "$forms"},
{$group: { _id: "$_id", status: {$addToSet: "$forms.status"}}},
{$unwind: "$status"},
{$sort: { _id: 1, status: -1} },
{$group: { _id: "$_id", status: {$first: "$status"} }},
{$match: { status: "closed"}},
{$project: { _id: "$_id._id", name: "$_id.name", forms: "$_id.forms"}}
])