2012-06-04 12 views
54

मैं कुछ डेटा है कि इस तरह दिखता है:MongoDB - संग्रह के अंदर एक नेस्टेड आइटम के लिए कैसे पूछताछ करें?

[ 
    { 
     "_id" : ObjectId("4e2f2af16f1e7e4c2000000a"), 
     "advertisers" : [ 
      { 
       "created_at" : ISODate("2011-07-26T21:02:19Z"), 
       "category" : "Infinity Pro Spin Air Brush", 
       "updated_at" : ISODate("2011-07-26T21:02:19Z"), 
       "lowered_name" : "conair", 
       "twitter_name" : "", 
       "facebook_page_url" : "", 
       "website_url" : "", 
       "user_ids" : [ ], 
       "blog_url" : "", 
      }, 

और मैं सोच रहा था कि इस तरह एक प्रश्न विज्ञापनदाता की आईडी देना होगा:

var start = new Date(2011, 1, 1); 
> var end = new Date(2011, 12, 12); 
> db.agencies.find({ "created_at" : {$gte : start , $lt : end} } , { _id : 1 , program_ids : 1 , advertisers { name : 1 } }).limit(1).toArray(); 

लेकिन मेरी क्वेरी काम नहीं किया। कोई विचार है कि मैं नेस्टेड तत्वों के अंदर फ़ील्ड को अपनी फ़ील्ड की सूची में कैसे जोड़ सकता हूं, मैं प्राप्त करना चाहता हूं?

धन्यवाद!

उत्तर

92

उपयोग डॉट नोटेशन (जैसे advertisers.name) क्वेरी और नेस्टेड वस्तुओं से खेतों को पुनः प्राप्त करने:

db.agencies.find({ "advertisers.created_at" : {$gte : start , $lt : end} } , { _id : 1 , program_ids : 1 , "advertisers.name": 1 } }).limit(1).toArray(); 

संदर्भ: Retrieving a Subset of Fields और Dot Notation

+0

सबकुछ प्रश्न में डेटा के अधीन है। अर्थात। शर्तें गलत हैं – AD7six

+8

'सीमा' (')' के साथ 'find' के बजाय' findOne' का उपयोग करना चाहिए। – EmmaGamma

3
db.agencies.find( 
{ "advertisers.created_at" : {$gte : start , $lt : end} } , 
{ program_ids : 1 , advertisers.name : 1 } 
).limit(1).pretty(); 
+1

.pritty()? क्या वह सही है? –

+0

यह है .pretty(), नहीं .pritty() :) –

+2

.findOne() .limit (1) से भी अधिक मूर्खतापूर्ण नहीं है? – Ben

1

वहाँ एक बात डॉट नोटेशन कहा जाता है कि MongoDB प्रदान करता है जो आपको तत्वों के सरणी के अंदर देखने की अनुमति देता है। इसका उपयोग करना प्रत्येक सरणी के लिए एक बिंदु जोड़ने जैसा सरल है जिसे आप दर्ज करना चाहते हैं।

अपने मामले

"_id" : ObjectId("4e2f2af16f1e7e4c2000000a"), 
    "advertisers" : [ 
     { 
      "created_at" : ISODate("2011-07-26T21:02:19Z"), 
      "category" : "Infinity Pro Spin Air Brush", 
      "updated_at" : ISODate("2011-07-26T21:02:19Z"), 
      "lowered_name" : "conair", 
      "twitter_name" : "", 
      "facebook_page_url" : "", 
      "website_url" : "", 
      "user_ids" : [ ], 
      "blog_url" : "", 
     }, 
     { ... } 

आप विज्ञापनदाताओं की सरणी के अंदर जाने के लिए उनमें से हर एक के अंदर संपत्ति created_at देखने के लिए चाहते हैं, आप बस संपत्ति { 'विज्ञापनदाताओं के साथ क्वेरी लिख सकते हैं। बनाया गया ': क्वेरी} जैसे

db.agencies.find({ 'advertisers.created_at' : { {$gte : start , $lt : end} ... } 
+0

न केवल आपने स्वीकृत उत्तर की प्रतिलिपि बनाई है, लेकिन आपने इसे बुरी तरह कॉपी किया है, 'विज्ञापनदाता {नाम: सत्य}' वैलीड सिंटैक्स नहीं है, भले ही आप भौतिक त्रुटियों को सही करना चाहते हों, मोंगोडीबी एक प्रोजेक्शन दस्तावेज़ को इस तरह से नहीं पढ़ता – Sammaye

संबंधित मुद्दे