2011-09-14 11 views
26

चलो कहते हैं कि मैं निम्नलिखित दस्तावेजों करतेmongoDB विशिष्ट और एक ही प्रश्न में कहां?

Article { Comment: embedMany } 

Comment { Reply: embedMany } 

Reply { email: string, ip: string } 

मैं एक प्रश्न का चयन करता है कि अलग Reply.ip जहां Reply.email = xxx

कुछ इस तरह, सिर्फ यह काम नहीं करता बनाना चाहते ..

db.Article.find("Comment.Reply.email" : "xxx").distinct("Comment.Reply.ip") 

JSON निर्यात:

{ 
    "_id":{ 
     "$oid":"4e71be36c6eed629c61cea2c" 
    }, 
    "name":"test", 
    "Comment":[ 
     { 
     "name":"comment test", 
     "Reply":[ 
      { 
       "ip":"192.168.2.1", 
       "email":"yyy" 
      }, 
      { 
       "ip":"127.0.0.1", 
       "email":"zzz" 
      } 
     ] 
     }, 
     { 
     "name":"comment 2 test", 
     "Reply":[ 
      { 
       "ip":"128.168.1.1", 
       "email":"xxx" 
      }, 
      { 
       "ip":"192.168.1.1", 
       "email":"xxx" 
      } 
     ] 
     } 
    ] 
} 

मैं चलाएँ: db.Article.distinct("Comment.Reply.ip",{"Comment.Reply.email" : "xxx"})

मैं उम्मीद: ["128.168.1.1", "192.168.1.1"]

मैं मिलती है: ["127.0.0.1", "128.168.1.1", "192.168.1.1", "192.168.2.1"]

+3

"मैं चलाने के", "मैं उम्मीद के लिए मेरे वोट दें है "," मुझे मिलता है ", अगर केवल सभी प्रश्न इस तरह प्रारूपित हैं! – adelriosantiago

+1

यहां समाधान का एक प्रकार है http://stackoverflow.com/a/13864518/358013 – blueskin

उत्तर

36

Distinct शर्त के साथ मोंगो में क्वेरी इस

+०१२३५१६४१०६ तरह काम करता है
db.Article.distinct("Comment.Reply.ip",{"Comment.Reply.email" : "xxx"}) 

नहीं दूसरी तरह के

चारों ओर संपादित करें:

मैं अब इस समस्या को समझने, inorder मैच के लिए/फिल्टर सहायक दस्तावेज़ों हम, $ elemMatch ऑपरेटर का उपयोग करने की जरूरत है इस

db.Article.distinct("Comment.Reply.ip",{Comment: {$elemMatch: {"Reply.email" : "xxx"}}}) 

की तरह लेकिन यह उप-दस्तावेज़ में उप सरणी (आपके मामले में, आपके पास उत्तरों की सरणी है) में काम नहीं करेगा। एक मौजूदा मुद्दा $elemMatch on subArray खोला गया है। और यह मोन्गो 2.1 के लिए योजना बनाई है। आप अधिक जानकारी

+0

मैंने कोशिश की और ऐसा लगता है कि यह स्थिति को अनदेखा कर रहा है, इसलिए परिणाम db.Article.distinct ("Comment.Reply.ip ") – Inoryy

+0

@Inori, कोड के ऊपर मेरे पर्यावरण में पूरी तरह से ठीक काम करता है ... क्या आप अपना वास्तविक डेटा पोस्ट कर सकते हैं और परिणाम जो आपको मिला है, इसलिए मैं खोद सकता हूं ... – RameshVel

+0

कृपया पहले पोस्ट – Inoryy

0

शायद के लिए लिंक की जांच कर सकते तो आप इस

db.Article.aggregate([ 
{$unwind: "$Comment"}, 
{$unwind: "$Comment.Reply"}, 
{$match: {"Comment.Reply.email": "xxx"}}, 
{$group: {_id: "$Comment.Reply.ip"}} 
]) 

की कोशिश कर सकते उदाहरण का परिणाम होना चाहिए

/* 1 */ 
{ 
    "_id" : "192.168.1.1" 
} 

/* 2 */ 
{ 
    "_id" : "128.168.1.1" 
} 
संबंधित मुद्दे