Wie verwende ich eine Variable als Feldnamen in mongodb-native findOne ()?

87

Ich habe diese Daten in Mongodb:

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

und ich möchte die Daten abrufen, während ich einen Feldnamen als Variable in der Abfrage übergebe.

Folgendes funktioniert nicht:

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

Wie kann ich mongodb abfragen, wobei sowohl der Feldname als auch sein Wert dynamisch bleiben?

WillMcavoy
quelle
Habe gerade diesen Beitrag gefunden. Ich denke, das ist wirklich unsicher. Denken Sie nicht, dass Sie bereinigen sollten, bevor Sie diese Werte in einer Abfrage verwenden?
McStuffins

Antworten:

138

Sie müssen den Schlüssel des Abfrageobjekts dynamisch festlegen:

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

Wenn Sie dies tun {name: value}, ist der Schlüssel die Zeichenfolge 'name'und nicht der Wert der Variablen name.

maxdec
quelle
Was ist, wenn Sie Operatoren wie $ gt in der Abfrage verwenden möchten?
Savvas Parastatidis
Sie ersetzen valuedurch Ihre Anfrage wie{ $gt: 50 }
maxdec
Wie man regulären Express mit der obigen Lösung übergibt var query = {}; Abfrage [Name] = Wert; ?
Rohit Luthra
3
Ich bin erfolgreich var query = {}; query ['registerNo'] = {"$ regex": sCode, "$ options": "m"};
Rohit Luthra
1
@ Levelone jemand war schneller als ich :)
Maxdec
56

Setzen Sie einfach die Variable in []

var name=req.params.name;
var value = req.params.value;
collection.findOne({[name]:value}, function(err, item) {
res.send(item);
});
KiwenLau
quelle
1
Ihre Antwort ist sehr einfach!
user523234
1
Dies funktioniert nicht als direkte Mongo-Abfrage. Sie erhalten einen Fehler zurück. E QUERY SyntaxError: Unerwartetes Token [ . Ich bin nicht sicher, wie es in node.js funktionieren kann?
Vince Bowdren
Ich denke, der Grund ist, dass nodejs eine Transformation durchführen, wenn sie mit mongodb interagieren.
KiwenLau
Diese Arbeit auf nativen Mongodb-Laufwerk für NodeJS! Vielen Dank!
Guihgo
Danke dir! Dies funktionierte in meinem viel abstrakteren Code, für den die akzeptierte Antwort keinen Sinn ergab (für die Aufzeichnung reagieren Sie nicht auf Knoten).
Adinutzyc21
7

Ich möchte klarstellen, dass, wenn Sie versuchen, eine Abfrage nur für ein verschachteltes Feld (nicht dessen Wert) durchzuführen, Sie beispielsweise das Feld "Name" aus diesem Dokument abfragen möchten:

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

Dies wird funktionieren (wie in meinem Fall - mit Update):

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

Das [query]einfache Einschließen in Klammern sagt Mongodb, dass es nicht wörtlich ist, sondern ein Pfad.

Hydrix
quelle
2

Verwenden Sie diese Option, wenn das Objekt verschachtelt ist.

Direktes Objekt:-

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

Ein Objekt ist verschachtelt: -

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
quelle
Dies hat geholfen, ich habe verwendet, 'name.${surname}'aber für Variablen verwenden wir nicht ', danke
1UC1F3R616