0

使用带有 NoRM 驱动程序的 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”返回每个带有标题的节目,其中包含单词 House(就像它在做 Contains 一样)。

我想要的是直接匹配。因此,如果 document.Titles 包含“A big blue House”,它不会返回匹配项。仅当 Titles.Description 包含“House”时,我才会想要匹配。

4

2 回答 2

2

我无法重现该问题,可能是因为我们使用了不同版本的 MongoDB 和/或 NoRM。但是,这里有一些步骤可以帮助您找到模糊结果的来源。

  1. 使用 MongoDB shell 打开分析:

    > 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 驱动程序中。例如,如果 NoRM 将您的代码转换为以下正则表达式查询,它将进行子字符串匹配:

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

我自己使用过 NoRM,但我还没有遇到过控制它的设置。也许您使用的是不同的版本,它确实带有这样的功能。

如果您的查询与应有的不同,请尝试从 shell 运行查询。如果它仍然出现模糊的结果,那么我们肯定使用的是不同版本的 MongoDB ;)

于 2010-12-08T08:44:47.857 回答
1

在 shell 语法中:

db.mycollection.find( { "Titles.Description" : "House" } )

于 2010-12-08T04:01:02.090 回答