【问题标题】:Mongoose.js: Find user by username LIKE valueMongoose.js:通过用户名 LIKE 值查找用户
【发布时间】:2012-04-07 02:47:39
【问题描述】:

我喜欢通过查找名为 value 的用户在 mongoDb 中查找用户。 问题:

username: 'peter'

如果用户名是“Peter”或“PeTER”.. 或类似的东西,我找不到它。

所以我想像 sql 那样做

SELECT * FROM users WHERE username LIKE 'peter'

希望你们得到我的要求?

简短:mongoose.js/mongodb 中的“字段 LIKE 值”

【问题讨论】:

  • 顺便说一句,SQL 查询找不到PeterPeTER,因为LIKE 不区分大小写。

标签: javascript node.js mongodb find mongoose


【解决方案1】:

您应该为此使用正则表达式。

db.users.find({name: /peter/i});

但请注意,此查询不使用索引。

【讨论】:

    【解决方案2】:
    collection.findOne({
        username: /peter/i
    }, function (err, user) {
        assert(/peter/i.test(user.username))
    })
    

    【讨论】:

    • 如果值是 var 怎么办?如何设置? /varhere/i ?
    • @PeterBechP 构造正则表达式:\new RegExp(var, "i")
    • 工作正常.. 现在我遇到了问题.. 如果 var 是 peter,它只需要找到 peter。但如果我将 var 设置为“p”,它仍然会找到 peter。
    • @PeterBechP 然后删除不区分大小写标志:\
    【解决方案3】:

    我最近遇到了这个问题,我使用这个代码并且工作正常。

    var data = 'Peter';
    
    db.User.find({'name' : new RegExp(data, 'i')}, function(err, docs){
        cb(docs);
    });
    

    直接使用/Peter/i 工作,但我使用'/'+data+'/i' 并不适合我。

    【讨论】:

    • 好吧,我只是尝试了一些。我也看到了,如果我只写 P??嗯。
    • 是的,我使用 ajax 请愿来搜索用户。你可以修改正则表达式。
    【解决方案4】:

    对于那些在这里寻找解决方案的人来说:

    var name = 'Peter';
    model.findOne({name: new RegExp('^'+name+'$', "i")}, function(err, doc) {
      //Do your action here..
    });
    

    【讨论】:

    • “i”参数是什么意思?跟区分大小写有关系吗?
    • "i" 是用于选择搜索标志的参数。 "i" 然后是不区分大小写的。你可以在这里读更多关于它的内容。 developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/…
    • 这假设正则表达式不是无效的。例如,如果您添加“[”作为用户名,将引发异常。只需确保您之前尝试捕获或正则表达式输入并检查 [^a-zA-Z0-9] 然后不继续。在这种情况下,它只是测试输入,所以有意义。
    • $ = 匹配字符串的结尾
    • @JasonSebring 虽然我同意输入验证不是一个坏主意,但最好的方法是实际的转义算法。异常甚至不是最严重的问题,但是假设您在登录页面上使用了类似的代码,并且用户输入了".*" 作为用户名。
    【解决方案5】:
    router.route('/product/name/:name')
    .get(function(req, res) {
    
        var regex = new RegExp(req.params.name, "i")
        ,   query = { description: regex };
    
        Product.find(query, function(err, products) {
            if (err) {
                res.json(err);
            }
    
            res.json(products);
        });
    
    });  
    

    【讨论】:

      【解决方案6】:

      这里是我的 expressJS 代码:

      router.route('/wordslike/:word')
          .get(function(request, response) {
                  var word = request.params.word;       
                  Word.find({'sentence' : new RegExp(word, 'i')}, function(err, words){
                     if (err) {response.send(err);}
                     response.json(words);
                  });
               });
      

      【讨论】:

        【解决方案7】:

        用于查找的猫鼬文档。 用于正则表达式的 mongodb 文档。

        var Person = mongoose.model('Person', yourSchema);
        // find each person with a name contains 'Ghost'
        Person.findOne({ "name" : { $regex: /Ghost/, $options: 'i' } },
            function (err, person) {
                     if (err) return handleError(err);
                     console.log('%s %s is a %s.', person.name.first, person.name.last, person.occupation);
        });
        

        注意我们传递给mongoose.findOne函数的第一个参数:{ "name" : { $regex: /Ghost/, $options: 'i' } }"name"是你正在搜索的文档的字段,"Ghost"是正则表达式,"i"是不区分大小写的匹配。希望这会对你有所帮助。

        【讨论】:

        • 什么是 $options
        【解决方案8】:

        如果我想在某个条件下查询所有记录,我可以使用这个:

        if (userId == 'admin')
          userId = {'$regex': '.*.*'};
        User.where('status', 1).where('creator', userId);
        

        【讨论】:

        【解决方案9】:

        以下查询将查找具有所需字符串不区分大小写且全局出现的文档

        var name = 'Peter';
            db.User.find({name:{
                                 $regex: new RegExp(name, "ig")
                             }
                        },function(err, doc) {
                                             //Your code here...
                      });
        

        【讨论】:

          【解决方案10】:

          这是我正在使用的。

          module.exports.getBookByName = function(name,callback){
              var query = {
                      name: {$regex : name}
              }
              User.find(query,callback);
          }
          

          【讨论】:

            【解决方案11】:
            db.users.find( { 'username' : { '$regex' : req.body.keyWord, '$options' : 'i' } } )
            

            【讨论】:

            • @MikeShi 有什么示例场景?
            • @LenJoseph 只是一般的 ReDoS 攻击:owasp.org/index.php/…,我不知道 mongoose 在这一点上是否容易受到攻击,或者是否有任何预期的功能可以检测 ReDoS 输入并在 mongoose 处对其进行清理水平。
            【解决方案12】:

            只是补充 @PeterBechP 的答案。

            不要忘记转义特殊字符。 https://stackoverflow.com/a/6969486

            function escapeRegExp(string) {
              return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
            }
            
            var name = 'Peter+with+special+chars';
            
            model.findOne({name: new RegExp('^'+escapeRegExp(name)+'$', "i")}, function(err, doc) {
              //Do your action here..
            });
            

            【讨论】:

              【解决方案13】:

              这是我将 req.body 中的 每个值 转换为 mongoose LIKE 参数的解决方案:

              let superQ = {}
              
              Object.entries({...req.body}).map((val, i, arr) => {
                  superQ[val[0]] = { '$regex': val[1], '$options': 'i' }
              })
              
              User.find(superQ)
                .then(result => {
                  res.send(result)})
                .catch(err => { 
                  res.status(404).send({ msg: err }) })
              

              【讨论】:

                【解决方案14】:

                动态搜索,你也可以这样关注,

                const { keyword, skip, limit, sort } = pagination(params);
                const search = keyword
                      ? {
                          title: {
                            $regex: new RegExp(keyword, 'i')
                          }
                        }
                      : {};
                
                Model.find(search)
                      .sort(sort)
                      .skip(skip)
                      .limit(limit);
                

                【讨论】:

                  猜你喜欢
                  • 2018-09-25
                  • 2015-12-23
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-09-11
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-12-16
                  • 1970-01-01
                  相关资源
                  最近更新 更多