2015-01-14 81 views
2

假設我有一個如下的對象數組。查詢在mongodb中檢索數組中的多個對象

"array" : [ 
    { 
     "id" : 1 
    }, 
    { 
     "id" : 2 
    }, 
    { 
     "id" : 2 
    }, 
    { 
     "id" : 4 
    } 
] 

如果我想要檢索多個對象({ID:2})從這個數組,聚集查詢是這樣的。

db.coll.aggregate([{ $match : {"_id" : ObjectId("5492690f72ae469b0e37b61c")}}, { $unwind : "$array"}, { $match : { "array.id" : 2}}, { $group : { _id : "$_id", array : { $push : { id : "$array.id"}}}} ]) 

上述聚集的輸出是

{ 
     "_id" : ObjectId("5492690f72ae469b0e37b61c"), 
     "array" : [ 
      { 
       "id" : 2 
      }, 
      { 
       "id" : 2 
      } 
     ] 
    } 

現在的問題是: 1)由使用查找() MongoDB中的陣列可能檢索多個對象的?

2)關於性能,是聚合是正確的方法嗎? (因爲我們需要使用四個管道運營商)?

3),我們可以使用Java操作(循環數組,並只保留{ID:2}對象)來做到這一點後 發現({ 「_ ID」:物件( 「5492690f72ae469b0e37b61c」)})查詢?因爲find會一次檢索文檔並將其保存在RAM中。但是如果我們使用聚合,則需要在RAM中執行四個操作來獲取輸出。

爲什麼我問3)的問題是:假設如果成千上萬的客戶端同時訪問,那麼RAM的內存將會超載。如果它是使用Java完成的,那麼RAM上的任務更少。

4)工作集將在RAM中存放多長時間 ??

我的理解是否正確?

請糾正我,如果我錯了。

請建議我有這個權利的洞察力..

+2

1每題的問題。這是如何工作的。否,沒有其他方法可以使用'.find()'過濾數組。聚合框架就是這個工具。請將您的其他問題作爲單獨的問題提出。問題4屬於[dba.stackexchange.com](http://dba.stackexchange。com) –

+0

並注意點「3」,就好像你沒有聚合任何東西或者需要這個在其他一些其他的階段那麼你可能更好的過濾你的客戶端陣列。這一切都取決於規模。 –

+0

聚合比find()慢。這就是我問問題3)的原因。那麼什麼是正確的方法。 find()+ Java或aggregation()? – manojpt

回答

3
  1. 號您項目的第一個匹配與$,你的項目所有的人,或者你的項目沒有。

  2. No-ish。如果你不得不使用這個數組,那麼聚合就是允許你提取多個匹配元素的東西,但是從概念和性能上來說,正確的解決方案就是設計你的文檔結構,所以這個問題不會出現,或者只出現在罕見的查詢中其表現並不特別重要。

  3. 是的。

  4. 我們沒有任何信息可以讓我們對這個問題給出合理的答案。相對於問題的其餘部分,這也超出了範圍,應該是一個單獨的問題。