2010-12-07 49 views
0

匹配使用MongoDB的符合規範的驅動程序我有這個文件:精確包含一個子集

{ 
    "_id" : ObjectId("0758030341b870c019591900"), 
    "TmsId" : "EP000015560091", 
    "RootId" : "1094362", 
    "ConnectorId" : "SH000015560000", 
    "SeasonId" : "7894681", 
    "SeriesId" : "184298", 
    "Titles" : [ 
      { 
        "Size" : 120, 
        "Type" : "full", 
        "Lang" : "en", 
        "Description" : "House" 
      }, 
      { 
        "Size" : 10, 
        "Type" : "red", 
        "Lang" : "en", 
        "Description" : "House M.D." 
      } 
    ], yadda yadda yadda 

,我查詢,如:

var query = new Expando(); 
query["Titles.Description"] = Q.In(showNames); 
var fuzzyMatches = db.GetCollection<Program>("program").Find(query).ToList(); 

其中showNames是一個字符串[]包含的東西像{「House」,「Glee」,「30 Rock」}

我的結果包含模糊匹配。例如,「House」一詞將每個節目返回一個Title,其中包含House這個詞(就像它在做一個Contains一樣)。

我想要的是直接匹配。所以如果document.Titles包含「一個大藍屋」,它不會返回匹配。只有在Titles.Description包含「House」的情況下,我才喜歡一場比賽。

回答

2

我一直無法重現該問題,也許因爲我們使用不同版本的MongoDB和/或NoRM。但是,這裏有一些步驟可以幫助您找到模糊結果的來源。

  1. 打開分析,使用MongoDB的外殼:

    > db.setProfilingLevel(2) 
    
  2. 再次運行代碼。
  3. 設定的分析水平回到0
  4. 審查已執行的查詢:

    > db.system.profile.find() 
    

分析信息應該是這個樣子:

{ 
    "ts" : "Wed Dec 08 2010 09:13:13 GMT+0100", 
    "info" : "query test.program ntoreturn:2147483647 reslen:175 nscanned:3 \nquery: { query: { Titles.Description: { $in: [ \"House\", \"Glee\", \"30 Rock\" ] } } } nreturned:1 bytes:159", 
    "millis" : 0 
} 

實際查詢屬於info屬性,應該是:

{ Titles.Description: { $in: [ "House", "Glee", "30 Rock" ] } } 

如果您的查詢看起來不同,那麼'問題'出現在NoRM驅動程序中。例如,如果規範你的代碼翻譯下面的正則表達式查詢時,它會做一個字符串匹配:

{ Titles.Description: { $in: [ /House/, /Glee/, /30 Rock/ ] } } 

我已經使用規範自己,但我還沒有碰到過的設置來控制這一點。也許你正在使用不同的版本,它具有這種功能。

如果您的查詢與應該的查詢沒有區別,請嘗試從shell運行查詢。如果它仍然出現模糊的結果,那麼我們肯定使用不同版本的MongoDB;)

1
殼語法

db.mycollection.find({ 「Titles.Description」: 「豪斯醫生」})

+0

很確定我無法通過NoRM傳遞原始shell查詢。 – jfar 2010-12-08 04:28:56

相關問題