【问题标题】:How can I find all documents where a field contains a particular string?如何找到字段包含特定字符串的所有文档?
【发布时间】:2014-06-07 15:10:45
【问题描述】:

我是 mongodb 和 mongoose 的新手,我试图弄清楚如何进行查询,让我找到字段包含特定字符串的所有记录/文档。这是用于搜索功能。例如,如果我有一个“users”集合,那么我想查找名字以字符串“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'”,这样这个查询才会起作用。基本上,它应该返回诸如“Joe”、“John”、“Joyce”等记录/文档。

更新===========================================

这是更新后的代码,但它返回所有记录,而不是只返回匹配“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”的用户,但它会返回每条记录。我该如何解决这个问题?

【问题讨论】:

  • 可以使用正则表达式进行匹配。不过效率不是很好。

标签: mongodb mongoose


【解决方案1】:

两种方法:
用正则表达式。 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

【讨论】:

    猜你喜欢
    • 2015-02-18
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    • 2023-03-19
    • 2022-09-28
    • 2022-08-02
    • 1970-01-01
    相关资源
    最近更新 更多