Come utilizzare una variabile come nome di campo in mongodb-native findOne ()?


89

Ho questi dati in mongodb:

{  
    "name": "Amey",
    "country": "India",
    "region": "Dhule,Maharashtra"
}

e voglio recuperare i dati mentre si passa un nome di campo come variabile nella query.

Quanto segue non funziona:

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

Come posso interrogare mongodb mantenendo dinamici sia il nome del campo che il suo valore?


Ho appena trovato questo post. Penso che questo sia davvero insicuro. Non pensi di dover disinfettare prima di utilizzare quei valori in una query?
McStuffins

Risposte:


142

È necessario impostare dinamicamente la chiave dell'oggetto query:

var name = req.params.name;
var value = req.params.value;
var query = {};
query[name] = value;
collection.findOne(query, function (err, item) { ... });

Quando lo fai {name: value}, la chiave è la stringa 'name'e non il valore della variabile name.


E se volessi utilizzare operatori come $ gt all'interno della query?
Savvas Parastatidis

Sostituisci valuecon la tua query come{ $gt: 50 }
maxdec

Come passare l'espresso regolare utilizzando la soluzione precedente var query = {}; query [nome] = valore; ?
Rohit Luthra

3
Ho successo var query = {}; query ['registrationNo'] = {"$ regex": sCode, "$ options": "m"};
Rohit Luthra

1
@levelone qualcuno era più veloce di me :)
maxdec

60

Basta inserire la variabile in []

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

1
La tua risposta è molto semplice!
user523234

1
Questo non funziona come una query mongo diretta; viene visualizzato un errore E QUERY SyntaxError: token imprevisto [ . Non sono sicuro di come possa funzionare in node.js?
Vince Bowdren

Penso che il motivo sia che nodejs eseguirà la trasformazione quando interagirà con mongodb.
KiwenLau

questo lavoro sull'unità mongodb nativa per nodejs! Grazie!
Guihgo

Grazie! Questo ha funzionato nel mio codice molto più astratto per il quale la risposta accettata non aveva senso (per la cronaca, reagire non nodeJs).
adinutzyc21

7

Vorrei chiarire che se stai cercando di fare una query riguardante solo un campo nidificato (non il suo valore), ad esempio se vuoi interrogare il campo "nome" da questo documento:

{
    loc: [0, 3],
    unit: {
        name : "playername"
    }
}

questo funzionerà (come nel mio caso - utilizzando l'aggiornamento):

mdb.cords.updateOne(
    {_id: ObjectID(someid)}, 
    {$set: {[query]: newValue}}, 
    function (err, result) {
        ...
    }
}

Racchiudere semplicemente [query]tra parentesi indica a mongodb che non è letterale, ma piuttosto un percorso.


2

utilizzare in questo modo se l'oggetto è annidato.

Oggetto diretto:-

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

Un oggetto è annidato: -

var surname=req.params.surname;
var value = req.params.value;
var condition = `name.${surname}`
collection.findOne({[condition]:value}, function(err, item) {
res.send(item);
});

Questo ha aiutato, stavo usando 'name.${surname}'ma per la variabile che non usiamo ', grazie
1UC1F3R616
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.