¿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?

WillMcavoy
fuente
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.

maxdec
fuente
¿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);
});
KiwenLau
fuente
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.

Hydrix
fuente
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);
});
Ankit Kumar Rajpoot
fuente
Esto ayudó, estaba usando 'name.${surname}'pero para la variable que no usamos ', gracias
1UC1F3R616