जब फील्ड नाम (कीज़) अज्ञात या डायनामिक हों, तो एग्रीगेशन में $objectToArray का उपयोग करके ऑब्जेक्ट को {k, v} जोड़े की सरणी में बदलें, फिर कीज़/मानों पर फ़िल्टर/मैच करें।
उदाहरण: डायनामिक कीज़ वाले दस्तावेज़
> db.demo375.insertOne({ "details":{ "Name":"John", "Age":23 } });
{ "acknowledged" : true, "insertedId" : ObjectId("5e5a0ae42ae06a1609a00b06") }
> db.demo375.insertOne({ "details":{ "Name":"David", "Age":21 } });
{ "acknowledged" : true, "insertedId" : ObjectId("5e5a0ae42ae06a1609a00b07") }
> db.demo375.insertOne({ "details":{ "Name":"David", "Age":22 } });
{ "acknowledged" : true, "insertedId" : ObjectId("5e5a0ae42ae06a1609a00b08") }
दस्तावेज़ देखना
> db.demo375.find();
आउटपुट: ज्ञात फील्ड्स के साथ तीन दस्तावेज़ (लेकिन मान लें कि कीज़ अज्ञात हैं)।
एग्रीगेशन: मान "David" वाली किसी भी कीज़ वाले दस्तावेज़ ढूंढें
> db.demo375.aggregate([
{ "$addFields": { "UnknownKeys": { "$objectToArray": "$$ROOT" } } },
{ "$match": { "UnknownKeys.v.Name": "David" } },
{ "$project": { "UnknownKeys": 0 } }
]);
परिणाम
दो दस्तावेज़ लौटाए गए जहां किसी भी नेस्टेड फील्ड Name = "David" है।
चरण व्याख्या
- $objectToArray ("$$ROOT"): पूरे दस्तावेज़ को
{k, v}सरणी में बदलता है (शीर्ष-स्तरीय फील्ड्स + नेस्टेड)। - $match on UnknownKeys.v.Name: सरणी में किसी भी
v.Name == "David"की जांच करता है। - $project: सहायक फील्ड हटाता है।
विचार
$$ROOTपूरे दस्तावेज़ को प्रोसेस करता है; बड़े दस्तावेज़ों के लिए, विशिष्ट सब-ऑब्जेक्ट को लक्षित करें:{$objectToArray: "$details"}।- प्रदर्शन: यह पूर्ण संग्रह स्कैन करता है; ज्ञात फील्ड्स पर इंडेक्स का उपयोग नहीं कर सकता। <ली>स्कीमा डिज़ाइन के लिए, पूरी तरह से डायनामिक कीज़ के बजाय ज्ञात फील्ड्स या सरणी-ऑफ-ऑब्जेक्ट्स पैटर्न पसंद करें।ली>