我正在运行一个 MongoDB 查询,但它没有拉回我知道应该拉回的记录。我过滤两件事:类别和描述(通过 contains/like 正则表达式)。如果我根据类别进行搜索,则该类别中的所有记录都会返回(包括问题记录),但如果我输入描述,则无法返回该记录。与描述文本匹配的其他记录会返回,但由于某种原因,无论我输入什么,我都无法让这一记录返回带有描述条件的记录。实在是太奇怪了。
如何使用 MongoDB 调试这样的事情?我的查询非常简单:
var match = {};
var category = "hardware"
if (category)
match.Category = category;
var searchText = "ceramic"
if (searchText)
{
match.Description = new RegExp("/.*" + searchText + ".*/");
}
collection.find(match).toArray(function(err, items)
{
response.send(items);
});
我试图取回的项目属于硬件类别,当 searchText 为“”时它会返回。它的描述中有“陶瓷”一词,但当 searchText 是“陶瓷”(或在其描述中找到任何数量的其他单词)时,该项目就不会回来。其他人的描述中带有“陶瓷”一词,但不是那个,当然该元素的结构与其他元素没有什么不同。确实应该通过比赛。
大小写正确(“ceramic”在描述和过滤器中都是较低的),并且我还尝试过/i 使搜索不区分大小写。
那么我怎样才能找出为什么这个查询无法生成与其非常匹配的项目呢?
最佳答案
嗯,这可能不是原因,但正则表达式有点奇怪。您应该能够指定这一点:
match.Description = new RegExp("/"+ searchText + "/");
.*
表示匹配任何字符任意次数 - 除非您试图贪婪地将所有内容与文本匹配并将其用作更复杂的正则表达式的一部分,否则您不需要它。
在调试方面,弄清楚您的查询在 MongoDB 中应该是什么样子,并确保它在 shell 中工作。这是一个快速示例文档:
{
"_id" : ObjectId("503fab7bf6a278b7bda257d2"),
"category" : "hardware",
"Description" : "blah ceramic blah"
}
这匹配:
mongos> db.foo.find({"Description" : /ceramic/}).pretty()
{
"_id" : ObjectId("503fab7bf6a278b7bda257d2"),
"category" : "hardware",
"Description" : "blah ceramic blah"
}
您还可以turn on profiling并观察您的程序发送到 MongoDB 的内容(小心,分析会产生开销)。您将希望级别 2 能够查看页面上提到的所有查询。
关于debugging - 如何调试 MongoDB 查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12198508/