Mam te dane w mongodb:
{
"name": "Amey",
"country": "India",
"region": "Dhule,Maharashtra"
}
i chcę pobrać dane podczas przekazywania nazwy pola jako zmiennej w zapytaniu.
Poniższe nie działa:
var name = req.params.name;
var value = req.params.value;
collection.findOne({name: value}, function(err, item) {
res.send(item);
});
Jak wysłać zapytanie do mongodb, zachowując dynamikę zarówno nazwy pola, jak i jego wartości?
Odpowiedzi:
Musisz dynamicznie ustawić klucz obiektu zapytania:
var name = req.params.name; var value = req.params.value; var query = {}; query[name] = value; collection.findOne(query, function (err, item) { ... });
Kiedy to zrobisz
{name: value}
, kluczem jest ciąg znaków,'name'
a nie wartość zmiennejname
.źródło
value
je swoim zapytaniem, np.{ $gt: 50 }
Po prostu umieść zmienną w []
var name=req.params.name; var value = req.params.value; collection.findOne({[name]:value}, function(err, item) { res.send(item); });
źródło
Chciałbym wyjaśnić, że jeśli próbujesz wykonać zapytanie dotyczące tylko pola zagnieżdżonego (a nie jego wartości), na przykład jeśli chcesz zapytać o pole „nazwa” z tego dokumentu:
{ loc: [0, 3], unit: { name : "playername" } }
to zadziała (jak w moim przypadku - za pomocą aktualizacji):
mdb.cords.updateOne( {_id: ObjectID(someid)}, {$set: {[query]: newValue}}, function (err, result) { ... } }
Samo umieszczenie
[query]
w nawiasach mówi mongodb, że nie jest to dosłowne, ale raczej ścieżka.źródło
użyj w ten sposób, jeśli obiekt jest zagnieżdżony.
Celem bezpośrednim:-
var name=req.params.name; var value = req.params.value; collection.findOne({[name]:value}, function(err, item) { res.send(item); });
Obiekt jest zagnieżdżony: -
var surname=req.params.surname; var value = req.params.value; var condition = `name.${surname}` collection.findOne({[condition]:value}, function(err, item) { res.send(item); });
źródło
'name.${surname}'