2012-07-23 14 views
5

Quiero buscar a través de mi repositorio de usuario con una cadena de consulta.Expressjs: consulta de búsqueda api

Esto debería devolver todos los usuarios con un nombre de usuario "kyogron" similar y similares de correo electrónico "kyogron @ gmail"

GET localhost:3000/users?username=kyogron&[email protected] 

Esto debería devolver todos los usuarios:

GET localhost:3000/users 

ya me las arreglé para manejar la parámetros de enrutamiento, pero estoy atascado en la optimización de él:

app.get('/users', function(req, res) { 
    // creates a mongoosejs query object 
    var query = User.find({}); 

    // to understand how expressjs handles queries: 
    // ?username=kyogron&[email protected] 
    // { username: "kyogron", email: "[email protected]" } 
    //console.log(req.query); 

    // this was one idea of optimizing the search query parameters 
    // this doesn't work don't know why I always get an array of ALL users 
    // even the key and value is right 
    Object.keys(req.query).forEach(function(key) { 
     query.select(key, req.query[key]); 
    }); 

    // this was the way I was first handling the parameters, this works !! 
    //if (req.query.username) query.where('username', req.query.username); 
    //if (req.query.email) query.where('email', req.query.email); 

    // the rest of the query 
    query.select('username', 'email'); 
    query.exec(function(err, users) { 
     if (err) throw err; 
     res.json(users); 
    }); 

}); 

Estos son los p Problemas con los que estoy peleando:

  1. ¿Por qué no iterar el objeto de consulta requerida?
  2. ¿Cómo digo mangosta utilizar un comodín (por ejemplo kyo *)

Sería bueno si alguien me podría ayudar :)

Saludos

EDITAR:

La segunda cuestión sería solucionable con $ donde:

if (req.query.username) { 
     query.$where(function() { 
      return this.username === req.query.username; // here we need a regex check 
     }); 
    } 

Thos no funciona ... ¿Podría alguien darme una pista?

Edit2:

¿No consiguió nada con $ ... sin embargo, donde ahora se encuentra

query.where('username').regex(); 

sólo tengo que buscar una expresión regular búsqueda, que busca palabras similares

Edit3:

me encontré con este tema: How to query MongoDB with "like"? te pido en el grupo mongoosejs cómo podría hacer esto con mangosta

EDIT4:

if (req.query.username) { 
      query.where('username').regex(new RegExp("\/"+req.query.username+"\/")); 
} 

casi lo tengo. Tan solo hay que solucionar este regex estúpida ...

Respuesta

1
app.get('/users', function(req, res) { 
    var query = User.find({}); 

    Object.keys(req.query).forEach(function(key) { 
     query.where(key).regex(new RegExp(req.query[key])); 
    }); 

    /* 
    if (req.query.username) { 
     query.where('username').regex(new RegExp(req.query.username)); 
    } 
    if (req.query.email) { 
     query.where('email').regex(new RegExp(req.query.email)); 
    }*/ 

    query.select('username', 'email'); 
    query.exec(function(err, users) { 
     if (err) throw err; 
     res.json(users); 
    }); 

}); 

La primera no funcionó porque tenía un error tipográfico (.select() no .Where()). El segundo se encontró en un hilo adicional

Todavía estoy un poco inseguro sobre el enfoque elegido.

Iterating req.query permitiría hacer el código reutilizable (tal vez como parámetro de enrutamiento precondición-función) pero es bastante susceptible a errores