web-dev-qa-db-fra.com

Comment utiliser une variable en tant que nom de champ dans mongodb-native findOne ()?

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 une requête.

Suivre ne fonctionne pas:

var name = req.params.name;
var value = req.params.value;
collection.findOne({name: value}, function(err, item) {
    res.send(item);
});

Comment interroger mongodb en conservant le nom du champ et sa valeur dynamiques?

78
WillMcavoy

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

Quand vous faites {name: value}, la clé est la chaîne 'name' et non la valeur de la variable name.

122
maxdec

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

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

Clôturant simplement [query] entre parenthèses indique à mongodb que ce n'est pas littéral, mais plutôt un chemin.

6
hydrix