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 la requête.
La suite ne fonctionne pas:
var name = req.params.name;
var value = req.params.value;
collection.findOne({name: value}, function(err, item) {
res.send(item);
});
Comment puis-je interroger mongodb en gardant à la fois le nom du champ et sa valeur dynamiques?
Réponses:
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) { ... });
Lorsque vous le faites
{name: value}
, la clé est la chaîne'name'
et non la valeur de la variablename
.la source
value
par votre requête comme{ $gt: 50 }
Mettez simplement la variable dans []
var name=req.params.name; var value = req.params.value; collection.findOne({[name]:value}, function(err, item) { res.send(item); });
la source
Je tiens à préciser que si vous essayez de faire une requête concernant un champ imbriqué uniquement (pas sa valeur), comme si vous souhaitez interroger le champ "nom" de ce document:
{ loc: [0, 3], unit: { name : "playername" } }
cela fonctionnera (comme dans mon cas - en utilisant la mise à jour):
mdb.cords.updateOne( {_id: ObjectID(someid)}, {$set: {[query]: newValue}}, function (err, result) { ... } }
Le simple fait
[query]
de mettre entre crochets indique à mongodb que ce n'est pas littéral mais plutôt un chemin.la source
utilisez comme ceci si l'objet est imbriqué.
Objet direct:-
var name=req.params.name; var value = req.params.value; collection.findOne({[name]:value}, function(err, item) { res.send(item); });
Un objet est imbriqué: -
var surname=req.params.surname; var value = req.params.value; var condition = `name.${surname}` collection.findOne({[condition]:value}, function(err, item) { res.send(item); });
la source
'name.${surname}'
mais pour la variable que nous n'utilisons pas ', merci