2014-02-12 43 views
2

陣列我有一個集合,如下所示: -

{ "_id" : 1, "grades" : [ 70, 87, 90 ] } 
{ "_id" : 2, "grades" : [ 90, 88, 92 ] } 

我使用下面的查詢: -

db.students.find({ semester: 1, grades: { $gte: 85 } }, 
        { "grades.$": 1 }) 

我得到的結果如下: -

{ "_id" : 1, "grades" : [ 87 ] } 
{ "_id" : 2, "grades" : [ 90 ] } 

現在我的問題是,當我在字段級上使用$ gte時,它將檢查數組中是否有任何元素匹配條件,修改文件。那麼爲什麼我得到第一個文檔的輸出爲87而不是70.我知道我們已經指定了一個相等條件「等級:{$ gte:85}」,但它已經將完整的文檔返回給我並投影了第一個字段。那麼爲什麼87是輸出?

回答

1

那麼,爲什麼我得到第一個文檔輸出爲87和70不會

因爲你特別要求它。這正是positional projection operator $的用途:它返回匹配查詢的第一個元素,因此投影grades.$ : 1將返回一個數組,其中包含匹配標準的數組中的第一個也是唯一的第一個元素,即第一個元素大於或等於85.

它可能會令人惱怒,它仍然是一個數組 - 畢竟,因爲它總是隻有一個元素,它們只能爲您提供像grades:87這樣的值。不過,這是MongoDB中的一種模式:除非您使用聚合框架,否則它不會修改數據的結構,從而更容易將查詢結果映射到靜態類型的語言。

如果你想擁有整個數組,那麼你就不需要投影都:

db.students.find({ semester: 1, grades: { $gte: 85 } }) 
{ "_id" : 1, semester: 1, "grades" : [ 70, 87, 90 ] } 
{ "_id" : 2, semester: 1, "grades" : [ 90, 88, 92 ] } 

如果只想數組(不是第一匹配元素)的第一個元素,你可以使用$slice

db.students.find({semester: 1, grades: { $gte: 85 } },{ "grades": {$slice : 1}}); 
{ "_id" : 1, semester: 1, "grades" : [ 70 ] } 
{ "_id" : 2, semester: 1, "grades" : [ 90 ] } 
+0

我有一個疑問,在這裏,我有什麼在我的腦海的是,當我們查詢任何與投影則發生兩件事情。 1)光標被返回以滿足條件,以便在這種情況下,它是文件{ 「_id」:1,學期:1, 「等級」:[70,87,90]} { 「_id」:2 ,學期:1,「成績」:[90,88,92]}。 2)現在,投影應用,我們得到這是 第一個元素{ 「_id」:1,學期:1, 「等級」:[70]} { 「_id」:2,學期:1, 「等級」 :[90]} 那麼爲什麼87在第一場呢? $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ – Saumyaraj

+1

的投影光標的一部分,它不是發生*之後*光標已返回的結果,但光標迭代過程中使用,所以它有關於匹配過程的知識,是的,否則將無法進行二次操作做它做的事。 – mnemosyn