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.