2012-06-04 27 views
54

Şöyle bazı veriler var:MongoDB - koleksiyon içindeki iç içe geçmiş bir öğe nasıl sorgulanır?

[ 
    { 
     "_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" : "", 
      }, 

ve böyle bir sorgu reklamverenin kimliği vereceğini düşünüyordum:

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(); 

Ama benim sorgu çalışmadı. İç içe geçmiş elemanların içerisindeki alanları nasıl eklemek istediğimi düşündüğüm herhangi bir fikrim var mı?

Teşekkürler!

cevap

92

kullanın nokta gösterimi (örn advertisers.name) sorgulamak ve iç içe nesnelerden alanları almak:

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

Referans: Retrieving a Subset of Fields ve Dot Notation

+0

Her şey sorudaki verilerde. Yani Koşullar yanlış – AD7six

+8

"FindOne" ifadesini 'find' ile 'limit' (1)' yerine kullanmalısınız. – EmmaGamma

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

.pritty()? bu doğru mu? –

+0

Bu .pretty(), değil .pritty() :) –

+2

.findOne(), daha fazla idiomatic .limit (1) de değil mi? – Ben

1

nokta gösterimde denilen bir şey MongoDB var sağlamaktadır Bu, elementlerin dizilerine bakmanızı sağlar. Bunu kullanmak, girmek istediğiniz her dizi için bir nokta eklemek kadar basittir.

"_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" : "", 
     }, 
     { ... } 

da bunların her birinin içinde mülkiyet created_at aramaya reklamverenlerin dizisi içine gitmek istiyorsanız Senin durumunda

, sadece mülkiyet {' reklamverenler ile sorgu yazabilirsiniz. created_at ': sorgu} aşağıdaki gibi izler

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

Sadece kabul edilen cevabı kopyalamanızla kalmadı, aynı zamanda kötü bir şekilde kopyaladığınızdan da, 'fiziki hatalar düzeltilse bile 'reklamverenler {name: true}' sözdizimi geçerli değil MongoDB bir projeksiyon belgesini bu şekilde okumaz – Sammaye

İlgili konular