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?


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.


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

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.


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

Cela a aidé, j'utilisais 'name.${surname}'mais pour la variable que nous n'utilisons pas ', merci
1UC1F3R616
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.