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?


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.


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

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.


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

Dies hat geholfen, ich habe verwendet, 'name.${surname}'aber für Variablen verwenden wir nicht ', danke
1UC1F3R616
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.