精确包含子集合上的匹配

时间:2010-12-07 18:23:00

标签: c# mongodb mongodb-.net-driver norm

将mongodb与NoRM驱动程序一起使用我有这个文档:

{
    "_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(就像它的包含一样)。

我想要的是直接比赛。因此,如果document.Titles包含“A big blue House”,则不会返回匹配项。只有当Titles.Description包含“House”时,我才会喜欢匹配。

2 个答案:

答案 0 :(得分:2)

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

  1. 使用MongoDB shell开启分析:

    > db.setProfilingLevel(2)
    
  2. 再次运行您的代码。
  3. 将分析级别设置回0。
  4. 查看已执行的查询:

    > db.system.profile.find()
    
  5. 分析信息应如下所示:

    {
      "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;)

答案 1 :(得分:1)

shell语法

  

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