你如何调试MongoDB查询?

时间:2012-08-30 13:53:40

标签: debugging mongodb

我有一个我正在运行的MongoDB查询,它没有撤回我知道应该记录的记录。我过滤了两件事:类别和描述(通过包含/喜欢正则表达式)。如果我基于类别进行搜索,那么该类别中的所有记录都会返回(包括问题记录),但是如果我引入描述,我就无法返回该记录。与描述文本匹配的其他记录会返回,但出于某种原因,无论我放入什么内容,我都无法通过描述条件返回此记录。这很奇怪。

如何使用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使搜索不区分大小写。

那么我怎样才能找出为什么这个查询无法生成一个非常清楚地匹配它的项目?

1 个答案:

答案 0 :(得分:1)

嗯,这可能不是原因,但正则表达式有点奇怪。您应该只能指定:

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能够查看页面上提到的所有查询。