2012-06-04 89 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" : "", 
      }, 

,我在想,這樣的查詢會給廣告客戶的ID:

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 FieldsDot Notation

+0

一切都在問題中的數據下。即條件是錯誤的 – AD7six

+8

應該使用'findOne',而不是'limit'(limit)'find'。 – 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 like

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

不僅您複製了已接受的答案,而且您已將其複製得很糟糕,即使您要更正物理錯誤,「advertisers {name:true}」也不是valiud語法。MongoDB不會以這種方式讀取投影文檔 – Sammaye