【问题标题】:How I can use "LIKE" operator on mongoose?如何在猫鼬上使用“LIKE”运算符?
【发布时间】:2017-09-29 11:08:43
【问题描述】:

我在使用 mongoose 进行查询时遇到问题。我按照 Mongoose.js: Find user by username LIKE value 进行编码。但它返回空白。

这是我的代码返回空白。

 var promise = UserSchema.find({name: /req.params.keyword/ }).limit(5);

我试过这个返回空白似乎。

var n = john; var promise = UserSchema.find({name: /n/ }).limit(5);

但我试过这是有效的

 var promise = UserSchema.find({name: /john/ }).limit(5);

为什么我使用变量然后返回空白?

【问题讨论】:

  • /.../ 语法仅适用于字符串,不适用于变量。您链接的问题中的许多答案都提供了您的答案。

标签: node.js mongodb mongoose


【解决方案1】:

在mongodb中使用$regex

how to use regex

例子

select * from table where abc like %v%

在蒙哥中

 var colName="v";
 models.customer.find({ "abc": { $regex: '.*' + colName + '.*' } },
   function(err,data){
         console.log('data',data);
  });

您的查询看起来像

var name="john";
UserSchema.find({name: { $regex: '.*' + name + '.*' } }).limit(5);

【讨论】:

  • 感谢您的回答。上面的 find 区分大小写。我如何在不区分大小写的情况下做到这一点?
  • 您是否阅读过文档how to use regex?您需要使用 { <field>: { $regex: 'pattern', $options: '<options>' } } 和选项 i,例如{ name: { $regex: req.params.keyword, $options: 'i' } }
  • i 用于不区分大小写
  • 您可以像往常一样在正则表达式模式之后添加选项。 /pattern/i
【解决方案2】:

您可以使用 RegExp 对象创建带有变量的正则表达式,如果您希望搜索不区分大小写,请添加“i”标志。

const mongoose = require('mongoose');
const User = mongoose.model('user');

const userRegex = new RegExp(userNameVariable, 'i')
return User.find({name: userRegex})

【讨论】:

    【解决方案3】:

    或者干脆

    const name = "John"
    UserSchema.find({name: {$regex: name, $options: 'i'}}).limit(5);
    

    i 表示不区分大小写

    【讨论】:

      【解决方案4】:

      这就是我如何查找名称/电子邮件中是否存在搜索字符串的方法。 希望它可以帮助某人。

      const getPeerSuggestions = async (req, res, next) => {
      
        const { search } = req.query;
        const rgx = (pattern) => new RegExp(`.*${pattern}.*`);
        const searchRgx = rgx(search);
      
        const peers = await User.find({
          $or: [
            { name: { $regex: searchRgx, $options: "i" } },
            { email: { $regex: searchRgx, $options: "i" } },
          ],
        })
          .limit(5)
          .catch(next);
      
        res.json(peers);
      };
      

      【讨论】:

        【解决方案5】:

        没有aggregate,它对我不起作用。但这确实:

        db.dbname.aggregate([{ "$match" : {"name" : { $regex: '.*SERGE.*', $options: 'i' } }}, { $sort: { "createdTime" : -1 }} ]).pretty()
        

        【讨论】:

          【解决方案6】:

          您可以使用RegExp 运行具有动态值的正则表达式查找:

           var promise = UserSchema.find({name: new RegExp(req.params.keyword, 'i') }).limit(5);
          

          注意'i' 选项不区分大小写。

          【讨论】:

            【解决方案7】:
             select * from table where abc like %_keyword%
            

            在 mongo 中是

              const list = await ProductModel.find({{ pname :{ $regex : '.*'+ _keyword + '.*' }});
            

            这里_keyword 可以是任何文本,例如。水果、钢笔等,因为我正在搜索产品型号。

            【讨论】:

              猜你喜欢
              • 2021-09-13
              • 1970-01-01
              • 2022-01-15
              • 2021-03-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-09-18
              相关资源
              最近更新 更多