$elemMatch . के व्यवहार में कुछ भी गलत नहीं है . यह अपेक्षा के अनुरूप काम करता है। डॉक्टर यह भी कहते हैं:
जब भी आप एक array project प्रोजेक्ट करते हैं, तो एक सामान्य नियम के रूप में $elemMatch . का उपयोग करके , केवल एक तत्वों का अनुमान लगाया जाएगा अधिकतम . यदि सरणी में कोई भी तत्व मेल नहीं खाता है, तो फ़ील्ड को बिल्कुल भी प्रक्षेपित नहीं किया जाएगा।
तो आपको जो परिणाम मिलता है वह सही है, सरणी में केवल पहला आइटम जो $elemMatch की स्थिति से मेल खाता है projectedहोगा .
{
"_id" : ObjectId("5439a2992ea8cc0f70feef2d"),
"Statuses" : [{
....
"StatusID": NumberLong(525623822633172993),
....
}]
}
आप स्थिति सरणी में दस्तावेज़ों के क्रम को बदलने का प्रयास कर सकते हैं, और एक अलग मिलान दस्तावेज़ प्राप्त कर सकते हैं यदि वह दस्तावेज़ सरणी में अन्य मिलान करने वाले दस्तावेज़ों के आगे दिखाई देता है।
देखें:$elemMatch
अपनी आवश्यकता के अनुसार, यदि आप अपने परिणाम में सभी मिलान करने वाले सरणी तत्व चाहते हैं, तो आपको एक एकत्रीकरण ऑपरेशन करने की आवश्यकता है।
Matchवे दस्तावेज़ जिनमें आवश्यक _id और वे दस्तावेज़ हैं जिनमें स्थिति उप दस्तावेज़ है जिसे हम खोज रहे हैं।unwindस्थिति सरणी।- फिर से
matchव्यक्तिगत अनवांटेड दस्तावेज़। - आखिरकार
group_id. द्वारा मिलान किए गए दस्तावेज़ ।
कोड:
db.collection.aggregate([
{$match:{ "_id": ObjectId("5439a2992ea8cc0f70feef2d"),
"Statuses.StatusID":{$gte : NumberLong(525623822633172993)}}},
{$unwind:"$Statuses"},
{$match:{"Statuses.StatusID":{$gte : NumberLong(525623822633172993)}}},
{$group:{"_id":"$_id",statuses:{$push:"$Statuses"}}}
])
जो आपको सरणी में सभी मिलान करने वाले उप दस्तावेज़ देगा।