2015-04-16 75 views
1

聚合,$ unwind和$ group不是我的解決方案,因爲它們使查詢非常緩慢,因爲我期望通過db.collection.find()方法獲取我的記錄。

問題是我需要更多的子數組中的一個值。例如,從以下示例中,我想獲得「類型」:「考試」「類型」:「測驗」元素。

{ 
    "_id" : 22, 
    "scores" : [ 
     { 
      "type" : "exam", 
      "score" : 75.04996547553947 
     }, 
     { 
      "type" : "quiz", 
      "score" : 10.23046475899236 
     }, 
     { 
      "type" : "homework", 
      "score" : 96.72520512117761 
     }, 
     { 
      "type" : "homework", 
      "score" : 6.488940333376703 
     } 
    ] 
} 

我看起來像

db.students.find(
// Search criteria 
{ '_id': 22 }, 

// Projection 
{ _id: 1, scores: { $elemMatch: { type: 'exam', type: 'quiz' } }} 
) 

的結果應該是像

{ "_id": 22, "scores" : [ { "type" : "exam", "type" : "quiz" } ] } 

但這在乘坐類型: '考試',只返回類型:'測驗'。有沒有人知道如何做到這一點與db.find()

回答

1

由於以下限制elemMatchmongo array fields,這是不可能直接使用findelemMatch

$ elemMatch操作符將查詢結果中字段的內容限制爲僅包含匹配$ elemMatch條件的第一個元素。 REF。從$elemMacth

和蒙戈陣列字段限制如下

只有一個位置$操作者可能會出現在投影文件內。

查詢文檔應該只包含正在投影的數組字段的單個條件。多個條件可能會在內部相互覆蓋並導致未定義的行爲。您嘗試以下從mongo array field limitations

因此,無論裁判這個找出僅examquiz

db.collectionName.find({"_id":22,"scores":{"$elemMatch":{"type":"exam"}}},{"scores.$.type":1}).pretty() 

是隻顯示exam分數陣列。

否則你應該通過aggregation

+0

感謝回答@yogesh,PLZ讓我知道什麼將是更短的時間查詢最佳聚集。 –

+0

檢查此http://stackoverflow.com/questions/2599943/mongodbs-performance-on-aggregation-queries或使用索引和分片 – Yogesh

+0

我已經索引和分片不是一個選項,我已經嘗試了很多聚合的選項,但展開使查詢方式變慢,這就是爲什麼我在find()中尋找任何解決方案的原因。 –