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

88

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?

WillMcavoy
la source
Je viens de trouver ce post. Je pense que ce n'est vraiment pas sûr. Ne pensez-vous pas que vous devriez nettoyer avant d'utiliser ces valeurs dans une requête?
McStuffins

Réponses:

140

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 variable name.

maxdec
la source
Que faire si vous souhaitez utiliser des opérateurs tels que $ gt dans la requête?
Savvas Parastatidis
Vous remplacez valuepar votre requête comme{ $gt: 50 }
maxdec
Comment passer l'express régulier en utilisant la solution ci-dessus var query = {}; requête [nom] = valeur; ?
Rohit Luthra
3
Je réussis var query = {}; query ['registrationNo'] = {"$ regex": sCode, "$ options": "m"};
Rohit Luthra
1
@levelone quelqu'un était plus rapide que moi :)
maxdec
57

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);
});
KiwenLau
la source
1
Votre réponse est très simple!
user523234
1
Cela ne fonctionne pas comme une requête mongo directe; vous obtenez une erreur retour E QUERY SyntaxError: jeton inattendu [ . Je ne sais pas comment cela peut fonctionner dans node.js?
Vince Bowdren
Je pense que la raison en est que nodejs effectuera une transformation lorsqu'il interagira avec mongodb.
KiwenLau
ce travail sur le lecteur natif mongodb pour nodejs! Merci!
Guihgo
Merci! Cela a fonctionné dans mon code beaucoup plus abstrait pour lequel la réponse acceptée n'avait aucun sens (pour mémoire, ne réagissez pas à nodeJs).
adinutzyc21
7

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.

Hydrix
la source
2

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);
});
Ankit Kumar Rajpoot
la source
Cela a aidé, j'utilisais 'name.${surname}'mais pour la variable que nous n'utilisons pas ', merci
1UC1F3R616