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?
Respuestas:
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 variablename
.fuente
value
por tu consulta como{ $gt: 50 }
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); });
fuente
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.fuente
Ú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); });
fuente
'name.${surname}'
pero para la variable que no usamos ', gracias