我是mongodb和mongoose的新手,我正在试图弄清楚如何进行查询,让我找到一个字段包含特定字符串的所有记录/文档。这适用于搜索功能。例如,如果我有一个“users”集合,那么我想找到名字以first开头的所有用户,比如字符串“Jo”。像这样:
var Users = require('./models/users');
Users.find({ firstname : contains the string 'Jo' }, function(err, user) {
if (err) {
return done(err);
} else {
return res.json({
firstname: user.firstname,
});
}
});
我不知道该替换“包含字符串'Jo'”,以便此查询可以正常工作。基本上,它应该返回记录/文件,如“乔”,“约翰”,“乔伊斯”等。
UPDATE ===========================================
这是更新的代码,但它返回所有记录,而不是只返回匹配“str”的记录:
app.get('/search/:str', function(req, res) {
var Users = require('./models/users');
Users.find({name: /[req.params.str]/}, function(err, data) {
if (err) return console.error(err);
return res.json(data);
})
});
问题在于/[req.params.str]/
。如果str
设置为“Jo”,那么它应该只返回其名称包含字符串“Jo”的用户,但它返回每条记录。我该如何解决这个问题?
答案 0 :(得分:3)
两种方法:
用正则表达式。 MongoDB支持正则表达式匹配。这是一个例子:
users.find({firstname: /Jo/}, function(err, doc) {...})
然而,如果你有一个大集合,它会变慢。因为正则表达式通常根本不使用索引,除非你有一个固定的前缀,如/ ^ Jo /.
或者在某些情况下,您可能想尝试使用新功能full text search: 首先,您需要一个文本索引:
db.users.ensureIndex( { firstname: "text" } );
然后使用$text运算符:
db.users.find({ $text: { $search: "Jo"}});
文本搜索不只是查找您正在搜索的内容。在某些情况下,它可能无法按照您想要的方式工作。
$ text运算符可以搜索单词和短语。查询匹配完整的词干。例如,如果文档字段包含单词blueberry,则对术语blue的搜索将与文档不匹配。
更多信息,请参阅document。