2016-08-15 104 views
0

學習MongoDB for node.js

在第二週的章下數組運算相與,這裏的boxOffice陣列:

boxOffice: [{ 
    "country": "USA", 
    "revenue": 41.3 
}, { 
    "country": "Australia", 
    "revenue": 2.9 
}, { 
    "country": "UK", 
    "revenue": 10.1 
}, { 
    "country": "Germany", 
    "revenue": 4.3 
}, { 
    "country": "France", 
    "revenue": 3.5 
}] 

下面是該查詢爲獲得收入大於15爲英國

db.movieDetails.find({ 
    boxOffice: { 
     $elemMatch: { 
      country: "UK", 
      revenue: { 
       $gt: 15 
      } 
     } 
    } 
}) 

這裏的困惑是,查詢過濾器在默認情況下並在MongoDB的發現查詢版,它應該返回文檔履行雙方country: "UK"revenue: { $gt: 15 }用下面的查詢的要求:

db.movieDetails.find({ 
    boxOffice: { 
     country: "UK", 
     revenue: { 
      $gt: 15 
     } 
    } 
}) 

一位專家說:這是錯誤的方式。

什麼是$elemMatch的好處,當查找過濾器默認編?

回答

4

你的第二個例子,它的制定方式是不會搜索包含國家:「英國」和收入大於15的boxOffice數組的文檔。相反,它會尋找與你「已經提供了boxOffice,我不認爲這是你的意圖。換句話說,它會搜索文檔,其中票房等於:(順便提一句,這樣的文件無法在集合中存在,因爲你不能開始與$字段名)

{ 
    country: "UK", 
    revenue: { 
     $gt: 15 
    } 
} 

相反,你會制定該查詢是這樣的:

{ 
    "boxOffice.country": "UK", 
    "boxOffice.revenue": { 
     $gt: 15 
    } 
} 

而且這裏的問題是,它不要求兩個條件包含在同一個數組元素中。 「英國」和收入大於15

這就是$ elemMatch進來它允許你:。因此,即使沒有與國家沒有單個數組元素,將匹配您的示例文件

{ 
    boxOffice: [{ 
     "country": "USA", 
     "revenue": 41.3 
    }, { 
     "country": "Australia", 
     "revenue": 2.9 
    }, { 
     "country": "UK", 
     "revenue": 10.1 
    }, { 
     "country": "Germany", 
     "revenue": 4.3 
    }, { 
     "country": "France", 
     "revenue": 3.5 
    }] 
} 

要求同一個數組元素滿足兩個(或多個)條件。所以它只會返回英國票房大於15的文件(代表電影,我假設)。

相關問題