¿Cómo usar una variable como nombre de campo en mongodb-native findOne ()?


88

Tengo estos datos en mongodb:

{  
    "name": "Amey",
    "country": "India",
    "region": "Dhule,Maharashtra"
}

y quiero recuperar los datos mientras paso un nombre de campo como variable en la consulta.

Lo siguiente no funciona:

var name = req.params.name;
var value = req.params.value;
collection.findOne({name: value}, function(err, item) {
    res.send(item);
});

¿Cómo puedo consultar mongodb manteniendo dinámicos tanto el nombre del campo como su valor?


Acabo de encontrar esta publicación. Creo que esto es realmente inseguro. ¿No cree que debería desinfectar antes de utilizar esos valores en una consulta?
McStuffins

Respuestas:


140

Debe establecer la clave del objeto de consulta de forma dinámica:

var name = req.params.name;
var value = req.params.value;
var query = {};
query[name] = value;
collection.findOne(query, function (err, item) { ... });

Cuando lo haga {name: value}, la clave es la cadena 'name'y no el valor de la variable name.


¿Qué sucede si desea utilizar operadores como $ gt dentro de la consulta?
Savvas Parastatidis

Reemplaza valuepor tu consulta como{ $gt: 50 }
maxdec

Cómo pasar el expreso regular usando la solución anterior var query = {}; consulta [nombre] = valor; ?
Rohit Luthra

3
Tengo éxito var query = {}; query ['registrationNo'] = {"$ regex": sCode, "$ opciones": "m"};
Rohit Luthra

1
@levelone alguien fue más rápido que yo :)
maxdec

57

Solo ingrese la variable en []

var name=req.params.name;
var value = req.params.value;
collection.findOne({[name]:value}, function(err, item) {
res.send(item);
});

1
¡Tu respuesta es muy sencilla!
user523234

1
Esto no funciona como una consulta directa de mongo; obtiene un error de vuelta E QUERY SyntaxError: Token inesperado [ . ¿No estoy seguro de cómo puede funcionar en node.js?
Vince Bowdren

Creo que la razón es que nodejs hará una transformación cuando interactúe con mongodb.
KiwenLau

¡Este trabajo en la unidad mongodb nativa para nodejs! ¡Gracias!
Guihgo

¡Gracias! Esto funcionó en mi código mucho más abstracto para el cual la respuesta aceptada no tenía sentido (para el registro, reaccionar no nodeJs).
adinutzyc21

7

Me gustaría aclarar que si está intentando realizar una consulta sobre un campo anidado solamente (no su valor), como si desea consultar el campo "nombre" de este documento:

{
    loc: [0, 3],
    unit: {
        name : "playername"
    }
}

esto funcionará (como en mi caso, usando la actualización):

mdb.cords.updateOne(
    {_id: ObjectID(someid)}, 
    {$set: {[query]: newValue}}, 
    function (err, result) {
        ...
    }
}

Simplemente encerrar [query]entre corchetes le dice a mongodb que no es literal, sino más bien una ruta.


2

Úselo así si el objeto está anidado.

Objeto directo:-

var name=req.params.name;
var value = req.params.value;
collection.findOne({[name]:value}, function(err, item) {
res.send(item);
});

Un objeto está anidado: -

var surname=req.params.surname;
var value = req.params.value;
var condition = `name.${surname}`
collection.findOne({[condition]:value}, function(err, item) {
res.send(item);
});

Esto ayudó, estaba usando 'name.${surname}'pero para la variable que no usamos ', gracias
1UC1F3R616
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.