C# 精确包含子集合上的匹配项
将mongodb与NoRM驱动程序一起使用,我有以下文档:C# 精确包含子集合上的匹配项,c#,mongodb,mongodb-.net-driver,norm,C#,Mongodb,Mongodb .net Driver,Norm,将mongodb与NoRM驱动程序一起使用,我有以下文档: { "_id" : ObjectId("0758030341b870c019591900"), "TmsId" : "EP000015560091", "RootId" : "1094362", "ConnectorId" : "SH000015560000", "SeasonId" : "7894681", "SeriesId" : "184298", "Titles" : [
{
"_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();
var query=newexpando();
查询[“Titles.Description”]=Q.In(showNames);
var fuzzyMatches=db.GetCollection(“程序”).Find(query.ToList();
其中showNames是一个字符串[]包含类似{“House”、“Glee”、“30rock”}
我的结果包含模糊匹配。例如,术语“House”返回的每个节目的标题中都有House一词(就像它在做一个Contains)
我想要的是直火柴。所以,如果document.Titles包含“一个蓝色的大房子”,它不会返回匹配项。只有当Titles.Description包含“House”时,我才需要匹配。在shell语法中:
db.mycollection.find({“Titles.Description”:“House”})
在shell语法中:
db.mycollection.find({“Titles.Description”:“House”})
我无法重现这个问题,可能是因为我们使用了不同版本的MongoDB和/或NoRM。然而,这里有一些步骤可以帮助您找到模糊结果的来源
> db.setProfilingLevel(2)
> 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将代码转换为以下regex查询,它将进行子字符串匹配:
{ Titles.Description: { $in: [ /House/, /Glee/, /30 Rock/ ] } }
我自己也用过NoRM,但我还没有遇到一个可以控制它的设置。也许您使用的是另一个版本,它确实具有这样的功能
如果您的查询与它应该使用的查询没有什么不同,请尝试从shell运行查询。如果结果仍然模糊,那么我们肯定在使用不同版本的MongoDB;) 我无法重现这个问题,可能是因为我们使用了不同版本的MongoDB和/或NoRM。然而,这里有一些步骤可以帮助您找到模糊结果的来源
> db.setProfilingLevel(2)
> 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将代码转换为以下regex查询,它将进行子字符串匹配:
{ Titles.Description: { $in: [ /House/, /Glee/, /30 Rock/ ] } }
我自己也用过NoRM,但我还没有遇到一个可以控制它的设置。也许您使用的是另一个版本,它确实具有这样的功能
如果您的查询与它应该使用的查询没有什么不同,请尝试从shell运行查询。如果结果仍然模糊,那么我们肯定在使用不同版本的MongoDB;) 非常确定我不能用NoRM传递原始shell查询。非常确定我不能用NoRM传递原始shell查询。