Mongoose.js: Kullanıcı adı LIKE değerine göre kullanıcıyı bulun


95

MongoDb'de değer adlı bir kullanıcıyı arayarak bir kullanıcı bulmayı seviyorum. İle ilgili sorun:

username: 'peter'

kullanıcı adı "Peter" veya "PeTER" ise bulamıyorum .. veya bunun gibi bir şey.

Bu yüzden sql gibi yapmak istiyorum

SELECT * FROM users WHERE username LIKE 'peter'

Umarım aradığımı anlarsınız?

Kısa: mongoose.js / mongodb'de 'alan LIKE value'


1
Sadece bir kenara SQL sorgusu bulmak olmaz Peterya PeTERya kadar LIKEküçük harf duyarsız değildir.
beny23

Yanıtlar:


148

Burada bir çözüm arayanlar için:

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

2
"i" argümanı ne anlama geliyor? Büyük / küçük harf duyarlılığı ile ilgisi var mı?
AzaFromKaza

2
"i" arama bayrağı seçmek için bir argümandır. Bu durumda "i" büyük / küçük harfe duyarlı değildir. Bununla ilgili daha fazla bilgiyi buradan okuyabilirsiniz. developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/…
PeterBechP

10
Bu, normal ifadenin geçersiz olmadığını varsayar. Örneğin bir kullanıcı adı olarak "[" eklerseniz, istisna atar. Girişinizi önceden yakaladığınızdan veya yeniden ifade ettiğinizden ve [^ a-zA-Z0-9] olup olmadığını kontrol edip devam etmediğinizden emin olun. Bu durumda, sadece test girişi çok mantıklı.
Jason Sebring

1
$ = Dizenin sonunu
eşleştir

1
@JasonSebring Girdi doğrulamanın kötü bir fikir olmadığını kabul etmeme rağmen, en iyi yaklaşım gerçek bir kaçış algoritmasıdır. Ve istisnalar en kötü sorun değildir, ancak bir giriş sayfasında benzer bir kod kullandığınızı ve kullanıcı ".*"adı olarak bir kullanıcının girdiğini hayal edin .
Tobias

78

Son zamanlarda bununla ilgili sorunlar yaşadım, bu kodu kullanıyorum ve benim için iyi çalışıyorum.

var data = 'Peter';

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

Doğrudan /Peter/içalışmayı kullan , ama kullanıyorum '/'+data+'/i've benim için çalışmıyorum.


Ben biraz daha denedim. Görüyorum ki sadece P yazıp yazmadığımı da buluyorum? hmmm.
PeterBechP

Evet, ajax dilekçelerini kullanıcıları aramak için kullanıyorum. RegExp'i değiştirebilirsiniz.
Donflopez

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

@MikeShi Bunun örnek senaryosu nedir?
Len Joseph

@LenJoseph genel olarak ReDoS saldırısı: owasp.org/index.php/… , firavun faresinin bu noktada savunmasız olup olmadığını veya ReDoS girişlerini tespit etmek ve firavun faresi seviyesinde sterilize etmek için herhangi bir amaçlanan işlevsellik olup olmadığını bilmiyorum.
Mike Shi

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

});  

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

ya değer bir var ise? Nasıl kurulur? / varhere / i?
PeterBechP

2
@PeterBechP bir normal ifade oluşturur: \new RegExp(var, "i")
Raynos

iyi çalışıyor .. şimdi bir sorunum var .. Sadece var olan peter ise Peter'ı bulmalı. Ancak var'ı 'p' olarak ayarlarsam, yine de Peter'ı bulacaktır.
PeterBechP

@PeterBechP daha sonra büyük / küçük harf duyarlılığı bayrağını kaldırın: \
Raynos

13

Bunun için bir normal ifade kullanmalısınız.

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

Yine de, bu sorguda dizin kullanılmadığına dikkat edin.


9

bulmak için firavun faresi doktor. regex için 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);
});

Biz geçmek ilk argüman Not mongoose.findOnefonksiyonu: { "name" : { $regex: /Ghost/, $options: 'i' } }, "name"Aradığınız belgenin bir alandır, "Ghost"düzenli ifadedir "i"harf duyarsız maçın içindir. Umarım bu sana yardımcı olur.


$ seçenekleri
nelerdir

8

Aşağıdaki sorgu, gerekli dize büyüklüğüne sahip belgeleri duyarsız olarak ve genel olarak ortaya çıkan belgeleri bulacaktır.

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

6

Kullandığım şey bu.

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

5

İşte expressJS ile kodum:

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

1

tüm kayıtları bir koşulda sorgulamak istersem, bunu kullanabilirim:

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

Ne $regexzaman kullanabileceğinizi gereksiz yere kullanmak gibi görünüyor { $exists: true }.
sean

0

@PeterBechP'in cevabını tamamlıyor.

Özel karakterlere bakmayı unutma. 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..
});

0

Bu, bir gerekli cisimdeki her değeri bir firavun faresi LIKE parametresine dönüştürmek için benim çözümüm :

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 }) })
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.