Jak użyć zmiennej jako nazwy pola w mongodb-native findOne ()?

88

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?

WillMcavoy
źródło
Właśnie znalazłem ten post. Myślę, że to jest naprawdę niepewne. Czy nie uważasz, że powinieneś oczyścić się przed użyciem tych wartości w zapytaniu?
McStuffins,

Odpowiedzi:

140

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ść zmiennej name.

maxdec
źródło
A co, jeśli chcesz użyć operatorów, takich jak $ gt, w zapytaniu?
Savvas Parastatidis
Zastąp valueje swoim zapytaniem, np.{ $gt: 50 }
maxdec
Jak przekazać wyrażenie regularne za pomocą powyższego rozwiązania var query = {}; zapytanie [nazwa] = wartość; ?
Rohit Luthra
3
Udało mi się var query = {}; query ['registrationNo'] = {"$ regex": sCode, "$ options": "m"};
Rohit Luthra
1
@levelone ktoś był szybszy ode mnie :)
maxdec
57

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);
});
KiwenLau
źródło
1
Twoja odpowiedź jest bardzo prosta!
user523234
1
To nie działa jako bezpośrednie zapytanie mongo; otrzymujesz błąd z powrotem E QUERY SyntaxError: Nieoczekiwany token [ . Nie jestem pewien, jak to może działać w node.js?
Vince Bowdren
Myślę, że powodem jest to, że nodejs dokona transformacji, gdy będzie współdziałać z mongodb.
KiwenLau
ta praca na natywnym dysku mongodb dla nodejs! Dzięki!
Guihgo
Dziękuję Ci! To zadziałało w moim znacznie bardziej abstrakcyjnym kodzie, dla którego przyjęta odpowiedź nie miała sensu (dla przypomnienia, reaguj nie nodeJs).
adinutzyc21
7

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.

hydrix
źródło
2

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);
});
Ankit Kumar Rajpoot
źródło
To pomogło, 'name.${surname}'
używałem,