आप परिणामों में जो देख रहे हैं वह सही है। आपका दृष्टिकोण थोड़ा गलत है। यदि आप अपेक्षित परिणाम चाहते हैं, तो आपको इस दृष्टिकोण का उपयोग करना चाहिए:
collection.aggregate([
{$match:{greetings:{$elemMatch:query}}},
{$unwind:"$greetings"},
{$match:{"greetings.hello":"world"}},
]).toArray()
इसके साथ, आपको निम्न आउटपुट मिलना चाहिए:
[
{greetings:{hello:"world"}},
{greetings:{hello:"world"}},
{greetings:{"hello":"world","extra":"data"}
]
जब भी आप aggregation
. का उपयोग कर रहे हों MongoDB में और एक एकत्रीकरण पाइपलाइन बनाना चाहते हैं जो आपके द्वारा अपेक्षित दस्तावेज़ उत्पन्न करे, आपको हमेशा अपनी क्वेरी पहले चरण से शुरू करनी चाहिए। और फिर बाद के चरणों से आउटपुट की निगरानी के लिए चरणों को जोड़ें।
आपके $unwind
. का आउटपुट चरण होगा:
[{
greetings:{hello:"world"}
},
{
greetings:{hello:"world", extra:"data"}
},
{
greetings:{hello:"world"}
},
{
greetings:{aloha:"mars"}
}]
अब यदि हम आपके द्वारा उपयोग किए गए तीसरे चरण को शामिल करते हैं, तो यह greetings
. के लिए मेल खाएगा कुंजी जिसका मान {hello:"world"}
. है और उस सटीक मूल्य के साथ, उसे पाइपलाइन में केवल दो दस्तावेज़ मिलेंगे। तो आप केवल प्राप्त कर रहे होंगे:
{ "greetings" : { "hello" : "world" } }
{ "greetings" : { "hello" : "world" } }