如何使用MongoDB Node.js驱动程序进行包含查询?

5

我正在尝试搜索包含特定子字符串的项目,但是返回的结果为空(即使我知道查询的数据是正确的,包括大小写):

collection.find({name: "/.*" + keyword + ".*/"}).toArray(function(err, items)

这个查询不应该匹配包含关键字的所有内容吗?它只返回了一个空对象。

我只是在ExpressJS应用程序中使用常规的MongoDB驱动程序。


你只能传递对象到find方法中,而不能传递字符串。而且它应该是一个正则表达式,而不是一个字符串。 - Jonathan Ong
好的,你说得对。实际上我在代码中传递了一个对象,这里我只是打了一个简单的例子。已经修复了。谢谢。 - Mike Pateras
4个回答

6

首先,您需要构建一个正则表达式,可以尝试这样写:

var regex = RegExp("/.*" + keyword + ".*/")

然后将变量传递给查询语句。我通常发现将查询语句作为变量更容易,并将其传递给查询:

var query = { FieldToSearch: new RegExp('^' + keyword) };
collection.find(query).toArray(...)

我已将正则表达式作为左根正则表达式包含,以利用索引(如果可能的话,始终建议采用此方法以提高性能)。更多信息请查看以下链接:http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-RegularExpressions

看一下上面的例子。他们没有构建一个RegExp对象。此外,我已经看到过几次人们使用脱字符号(^)来表示.*。脱字符不是一个否定运算符吗?我认为^关键字应该匹配除了关键字以外的所有内容。 - Mike Pateras
不,正则表达式中的^是行起始锚点,而不是否定符号,它基本上只是表示“以...开头”。 - Adam Comerford
1
在字符类中,插入符号(^)只能否定特定的字符:[^aeiou] - davestewart

1
我是这样做的。
    keyword = "text_to_search";
    collection.find({name: {$Regex: keyword, $options:$i }})

我使用了 $i 来使查询不区分大小写,但您也可以使用其他选项。

0

我从请求参数中获取了关键词,想要在noteBody中使用这些关键词进行搜索,现在关键词是一个变量。如果你想在数据库查询中使用变量,格式必须为 var regex = RegExp("." + keyword + "."). 希望能帮到你。谢谢。


0

试试这个:

var keyword = req.params.keywords;
var regex = RegExp(".*" + keyword + ".*");
Note.find({noteBody: regex, userID: userID})

我从请求参数中获取了关键词,并想要在noteBody中使用这些关键词进行搜索,现在这些关键词是一个变量。如果你想在数据库查找中使用一个变量,格式必须是var regex = RegExp("." + keyword + "."). 希望这能帮到你。谢谢。 - Kelci Huang
@KelciHung:请在答案部分添加。 - Ram Ghadiyaram

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接