सीमा: केवल एम्बेडेड दस्तावेज़ नहीं लौटाया जा सकता
MongoDB का find() हमेशा शीर्ष-स्तरीय दस्तावेज़ लौटाता है। आप केवल एम्बेडेड सरणी के मिलान वाले तत्वों को सीधे फ़िल्टर करके नहीं निकाल सकते। इसके लिए एग्रीगेशन पाइपलाइन ($unwind, $match, $project) की आवश्यकता होती है।
उदाहरण: एम्बेडेड सरणी के साथ दस्तावेज़
> db.queryToEmbeddedDocument.insertOne({
"UserName": "Larry",
"PostDetails": [
{"UserMessage": "Hello", "UserLikes": 8},
{"UserMessage": "Hi", "UserLikes": 6},
{"UserMessage": "Good Morning", "UserLikes": 12},
{"UserMessage": "Awesome", "UserLikes": 4}
]
});
{ "acknowledged" : true, "insertedId" : ObjectId("5c988a9f330fd0aa0d2fe4bd") }
पूरा दस्तावेज़ देखना
> db.queryToEmbeddedDocument.find().pretty();
आउटपुट: पूरा दस्तावेज़ जिसमें पूरी PostDetails सरणी शामिल है।
प्रोजेक्शन के साथ क्वेरी (सीमा प्रदर्शित करता है)
> db.queryToEmbeddedDocument.find({"PostDetails.UserLikes": {$gte: 8}}, {PostDetails: 1}).pretty();
आउटपुट: पूरा दस्तावेज़ लौटाता है, केवल UserLikes >= 8 वाले तत्व नहीं। प्रोजेक्शन केवल शीर्ष-स्तरीय फ़ील्ड को शामिल/बहिष्कृत करता है, सरणी तत्वों को फ़िल्टर नहीं करता।
समाधान: एग्रीगेशन पाइपलाइन का उपयोग करें
केवल मिलान करने वाले एम्बेडेड दस्तावेज़ प्राप्त करने के लिए:
db.queryToEmbeddedDocument.aggregate([
{ $unwind: "$PostDetails" },
{ $match: { "PostDetails.UserLikes": { $gte: 8 } } },
{ $project: { _id: 0, "PostDetails": 1 } }
]);
निष्कर्ष: सरल find() के साथ केवल एम्बेडेड दस्तावेज़ लौटाना संभव नहीं है। सरणी तत्वों को फ़िल्टर करने और पुनः आकार देने के लिए एग्रीगेशन फ्रेमवर्क का उपयोग करें।