91 votes

Comment utiliser une variable comme nom de champ dans findOne() de mongodb-native ?

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 comme variable dans la requête.

Le suivi 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 le nom du champ et sa valeur dynamiques ?

148voto

maxdec Points 2243

Vous devez définir la clé de l'objet de la 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 le faites {name: value} la clé est la chaîne de caractères 'name' et non la valeur de la variable name .

74voto

KiwenLau Points 1131

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);
});

7voto

hydrix Points 122

J'aimerais préciser que si vous essayez de faire une requête concernant un champ imbriqué seulement (pas sa valeur), comme si vous voulez 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) {
        ...
    }
}

Enfermer simplement [query] entre parenthèses indique à mongodb qu'il n'est pas littéral, mais plutôt un chemin.

6voto

À utiliser 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);
});

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X