2012-03-22 11 views
69

Mi piace andare a cercare un utente in mongoDb cercando un utente chiamato value. Il problema con:Mongoose.js: Trova utente per username LIKE valore

username: 'peter' 

è che io non trovarlo se il nome utente è "Pietro", o "Peter" .. o qualcosa di simile.

Quindi voglio fare come SQL

SELECT * FROM users WHERE username LIKE 'peter' 

Spero che voi ragazzi ottiene quello che im Askin per?

breve: 'campo di valore LIKE' in mongoose.js/MongoDB

+1

Solo un parte, la query SQL sarebbe non trovare 'Peter' o' PeTER' sia come 'LIKE' non è case-insensitive. – beny23

+7

perché downvotare un nuovo arrivato? – Mustafa

risposta

116

Bene. Solo per le persone che sono Lookin per la risposta che ho fatto come questo

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

cosa significa "i" argomento? Ha qualcosa a che fare con la case sensitive? – AzaFromKaza

+2

"i" è un argomento per la scelta di un flag di ricerca. "i" è quindi per insensibile al maiuscolo/minuscolo. Puoi leggere di più qui. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions – PeterBechP

+9

Questo presuppone che la regex non è valida. Se aggiungi "[" come nome utente, ad esempio, verrà generata un'eccezione. Assicurati solo di provare a catturare o di regexare il tuo input prima e di controllare [^ a-zA-Z0-9], quindi non procedere. In questo caso, il suo giusto input di test ha senso. –

12

Si dovrebbe usare una regex per questo.

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

Fare attenzione, tuttavia, che questa query non utilizza l'indice.

+0

Grazie per la risposta veloce! :) – PeterBechP

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

e se il valore fosse var? Come impostarlo?/varhere/i? – PeterBechP

+0

@PeterBechP costruisce un'espressione regolare: \ 'new RegExp (var," i ")' – Raynos

+0

funziona bene .. ora ho un problema .. Devo solo trovare peter se var è peter. Ma se imposto il var su 'p', troverà ancora peter. – PeterBechP

54

Ho avuto problemi con questo recentemente, io uso questo codice e funziona bene per me.

var data = 'Peter'; 

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

Usa direttamente /Peter/i lavoro, ma io uso '/'+data+'/i' e non lavoro per me.

+0

Beh, l'ho appena provato di più. Lo vedo anche se scrivo solo P ?? hmmm. – PeterBechP

+0

Sì, utilizzo per le petizioni Ajax per cercare utenti. È possibile modificare RegExp. – Donflopez

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

}); 
5

Qui il mio codice con 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); 
      }); 
     }); 
3

mangusta doc per trovare. mongodb doc per regex.

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

Nota il primo argomento che passiamo alla funzione mongoose.findOne. "{" nome ": {$ regex:/Ghost /, $ options: 'i'}}". "nome" è il campo del documento che stai cercando. "Ghost" è l'espressione regolare. "i" è per la corrispondenza insensibile al maiuscolo/minuscolo. Spero che questo ti possa aiutare.

+0

quali sono le opzioni $ – kabuto178

1

se voglio interrogare tutti i record a qualche condizione, posso usare questo:

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

La seguente query troverà i documenti con stringa necessaria caso insensibile e con insorgenza globale anche

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

Questo è quello che sto usando.

module.exports.getBookByName = function(name,callback){ 
    var query = { 
      name: {$regex : name} 
    } 
    User.find(query,callback); 
} 
4
db.users.find({ 'username' : { '$regex' : req.body.keyWord, '$options' : 'i' } })