2012-06-04 4 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

Должен использоваться 'findOne', а не' find' с 'limit (1)'. – 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 внутри каждого из них, вы можете просто написать запрос с имущественными {»рекламодателей. created_at ': query} like following

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

Не только то, что вы скопировали принятый ответ, но вы его скопировали плохо, 'advertisers {name: true}' не является синтаксисом valiud, даже если вы должны исправить физические ошибки. MongoDB не читает проекционный документ таким образом – Sammaye

Смежные вопросы