MongoDB में सरणी के दो अलग-अलग तत्वों के अलग-अलग मानदंड पूरे करने की जांच के लिए $elemMatch के साथ $and का उपयोग करें।
उदाहरण
संख्या सरणी वाले दस्तावेज़ बनाएं:
> db.findDocumentsHaving2Demo.insertOne({_id: 101, Values: [78, 98]});
{ "acknowledged" : true, "insertedId" : 101 }
> db.findDocumentsHaving2Demo.insertOne({_id: 102, Values: [89, 102]});
{ "acknowledged" : true, "insertedId" : 102 }
दस्तावेज़ देखें:
> db.findDocumentsHaving2Demo.find().pretty();
{ "_id" : 101, "Values" : [ 78, 98 ] }
{ "_id" : 102, "Values" : [ 89, 102 ] }
क्वेरी: एक तत्व 77-78 के बीच AND दूसरा 90-110 के बीच AND केवल 2 तत्व
> db.findDocumentsHaving2Demo.find({
$and: [
{Values: {$elemMatch: {$gte: 77, $lte: 78}}},
{Values: {$elemMatch: {$gte: 90, $lte: 110}}},
{'Values.2': {$exists: false}}
]
});
आउटपुट:
{ "_id" : 101, "Values" : [ 78, 98 ] }
व्याख्या:
$elemMatch: {$gte: 77, $lte: 78}- एक ही तत्व दोनों शर्तें पूरी करे (77-78)$elemMatch: {$gte: 90, $lte: 110}- एक (अन्य) तत्व 90-110 के बीचValues.2: {$exists: false}- तीसरा तत्व नहीं (सरणी लंबाई 2)$and- सभी शर्तें पूरी होनी चाहिए
क्यों दो $elemMatch?
यदि आप लिखते:
{Values: {$elemMatch: {$gte: 77, $lte: 78, $gte: 90, $lte: 110}}}
यह एक ही तत्व के लिए असंभव शर्त बन जाता है (साथ में 77-78 और 90-110)।
दो अलग $elemMatch अलग-अलग तत्वों से मेल खा सकते हैं।
सरणी इंडेक्स नोटेशन विकल्प
db.collection.find({
"Values.0": {$gte: 77, $lte: 78},
"Values.1": {$gte: 90, $lte: 110},
"Values.2": {$exists: false}
})
यह सरणी क्रम पर निर्भर करता है (पहला तत्व 77-78, दूसरा 90-110)। $elemMatch क्रम-स्वतंत्र है।