2

我有一个正在运行的 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 是“陶瓷”(或在其描述中找到的任何其他词)时,该项目就不会回来了。其他在描述中带有“陶瓷”一词的人会这样做,但不是那个,当然该项目的结构与其他项目没有什么不同。它真的应该通过比赛。

大小写是正确的(“陶瓷”在描述和过滤器中都较低),我也尝试过 /i 使搜索不区分大小写。

那么我怎样才能找出为什么这个查询没有产生一个非常清楚匹配它的项目呢?

4

1 回答 1

2

好吧,这可能不是这里的原因,但是那个正则表达式有点奇怪。你应该能够指定这个:

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"
}

您还可以打开分析并观察您的程序发送到 MongoDB 的内容(小心,分析有开销)。您将希望级别 2 能够查看页面上提到的所有查询。

于 2012-08-30T18:19:13.387 回答