Mongoose.js:按用户名LIKE值查找用户

时间:2012-03-22 14:12:10

标签: javascript node.js mongodb find mongoose

我想通过查找名为value的用户来找到mongoDb中的用户。 问题:

username: 'peter'

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

所以我想做sql

SELECT * FROM users WHERE username LIKE 'peter'

希望你们得到我要求的东西?

短:mongoose.js / mongodb中的'字段LIKE值'

14 个答案:

答案 0 :(得分:136)

好。对于那些正在寻找答案的人来说,我就是这样做的

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

答案 1 :(得分:67)

我最近遇到了这个问题,我使用这段代码并且对我来说很好。

var data = 'Peter';

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

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

答案 2 :(得分:21)

db.users.find( { 'username' : { '$regex' : req.body.keyWord, '$options' : 'i' } } )

答案 3 :(得分:14)

collection.findOne({
    username: /peter/i
}, function (err, user) {
    assert(/peter/i.test(user.username))
})

答案 4 :(得分:13)

你应该使用正则表达式。

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

但要小心,此查询不使用索引。

答案 5 :(得分:13)

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 :(得分:6)

mongoose doc for find。 正则表达的mongodb doc。

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"是正则表达式,{{ 1}}用于不区分大小写的匹配。希望这会对你有所帮助。

答案 7 :(得分:6)

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

super

答案 8 :(得分:6)

这就是我正在使用的。

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

答案 9 :(得分:5)

这里我的代码是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);
            });
         });

答案 10 :(得分:2)

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

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);

答案 11 :(得分:1)

如果我想在某种情况下查询所有记录,我可以使用:

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

答案 12 :(得分:0)

只需补充@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 :(得分:0)

这是将需求中的每个值转换为猫鼬 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 }) })