MongoDB में ऑब्जेक्ट के ऐरे में खोज के लिए $elemMatch ऑपरेटर का उपयोग करें। यह एक ही ऐरे एलिमेंट में मल्टीपल फील्ड क्राइटेरिया मैच करने की अनुमति देता है।
उदाहरण से समझें
एक कलेक्शन बनाकर नेस्टेड ऑब्जेक्ट ऐरे वाला डॉक्यूमेंट इन्सर्ट करते हैं:
> db.searchArrayDemo.insertOne({
"EmployeeFirstName": "Adam",
"EmployeeLastName": "Smith",
"EmployeeDateOfBirth": ISODate("1992-01-31T13:45:10Z"),
"EmployeeSkills": ["Spring and Hibernate Framework", "Machine Learning"],
"EmployeeDetails": [
{"EmployeePerformanceArea": "Java", "Year": 2001},
{"EmployeePerformanceArea": "Python", "Year": 2005}
]
});
> db.searchArrayDemo.insertOne({
"EmployeeFirstName": "Carol",
"EmployeeLastName": "Taylor",
"EmployeeDateOfBirth": ISODate("1993-04-21T11:10:20Z"),
"EmployeeSkills": ["C++", "Cloud Computing"],
"EmployeeDetails": [
{"EmployeePerformanceArea": "C++", "Year": 1998},
{"EmployeePerformanceArea": "C++ Game Developer", "Year": 2007}
]
});
सभी डॉक्यूमेंट देखने के लिए:
> db.searchArrayDemo.find().pretty();
केस 1: एलिमेंट मिलने पर
EmployeePerformanceArea: "C++" और Year: 1998 दोनों वाला एलिमेंट खोजें:
> db.searchArrayDemo.find({EmployeeDetails: {$elemMatch: {EmployeePerformanceArea: "C++", Year: 1998}}}).pretty();
आउटपुट:
{ "_id": ..., "EmployeeFirstName": "Carol", "EmployeeLastName": "Taylor", "EmployeeDateOfBirth": ISODate("1993-04-21T11:10:20Z"), "EmployeeSkills": ["C++", "Cloud Computing"], "EmployeeDetails": [ {"EmployeePerformanceArea": "C++", "Year": 1998}, {"EmployeePerformanceArea": "C++ Game Developer", "Year": 2007} ] }
केस 2: एलिमेंट न मिलने पर
> db.searchArrayDemo.find({EmployeeDetails: {$elemMatch: {EmployeePerformanceArea: "C", Year: 1996}}}).pretty();
कोई परिणाम नहीं मिलेगा क्योंकि ऐसा कोई एलिमेंट नहीं है।
$elemMatch के बिना क्वेरी अलग-अलग ऐरे एलिमेंट से फील्ड मैच कर सकती है, जो गलत परिणाम देगी।