J'ai ces données dans mongodb:
{
"name": "Amey",
"country": "India",
"region": "Dhule,Maharashtra"
}
et je veux récupérer les données en passant un nom de champ en tant que variable dans une requête.
Suivre ne fonctionne pas:
var name = req.params.name;
var value = req.params.value;
collection.findOne({name: value}, function(err, item) {
res.send(item);
});
Comment interroger mongodb en conservant le nom du champ et sa valeur dynamiques?
Vous devez définir la clé de l'objet de requête de manière dynamique:
var name = req.params.name;
var value = req.params.value;
var query = {};
query[name] = value;
collection.findOne(query, function (err, item) { ... });
Quand vous faites {name: value}
, la clé est la chaîne 'name'
et non la valeur de la variable name
.
Il suffit de mettre la variable dans []
var name=req.params.name;
var value = req.params.value;
collection.findOne({[name]:value}, function(err, item) {
res.send(item);
});
J'aimerais préciser que si vous essayez de faire une requête concernant un champ imbriqué uniquement (pas sa valeur), comme si vous vouliez interroger le champ "nom" de ce document:
{
loc: [0, 3],
unit: {
name : "playername"
}
}
cela fonctionnera (comme dans mon cas - en utilisant update):
mdb.cords.updateOne(
{_id: ObjectID(someid)},
{$set: {[query]: newValue}},
function (err, result) {
...
}
}
Clôturant simplement [query]
entre parenthèses indique à mongodb que ce n'est pas littéral, mais plutôt un chemin.