Bagaimana cara menggunakan variabel sebagai nama bidang di mongodb-native findOne ()?

89

Saya memiliki data ini di mongodb:

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

dan saya ingin mengambil data sambil meneruskan nama bidang sebagai variabel dalam kueri.

Mengikuti tidak berfungsi:

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

Bagaimana cara meminta mongodb dengan menjaga nama bidang dan nilainya tetap dinamis?

WillMcavoy
sumber
Baru saja menemukan postingan ini. Saya pikir ini benar-benar tidak aman. Tidakkah Anda berpikir bahwa Anda harus membersihkan sebelum menggunakan nilai-nilai tersebut dalam kueri?
McStuffins

Jawaban:

142

Anda perlu menyetel kunci objek kueri secara dinamis:

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

Ketika Anda melakukannya {name: value}, kuncinya adalah string 'name'dan bukan nilai variabel name.

maxdec
sumber
Bagaimana jika Anda ingin menggunakan operator seperti $ gt di dalam kueri?
Savvas Parastatidis
Anda mengganti valuedengan kueri Anda seperti{ $gt: 50 }
maxdec
Cara menyampaikan regular express menggunakan solusi var query = {}; kueri [nama] = nilai; ?
Rohit Luthra
3
Saya berhasil var query = {}; query ['RegistrationNo'] = {"$ regex": sCode, "$ options": "m"};
Rohit Luthra
1
@levelone seseorang lebih cepat dari saya :)
maxdec
60

Letakkan saja variabel di []

var name=req.params.name;
var value = req.params.value;
collection.findOne({[name]:value}, function(err, item) {
res.send(item);
});
KiwenLau
sumber
1
Jawaban Anda sangat mudah!
pengguna523234
1
Ini tidak berfungsi sebagai kueri mongo langsung; Anda mendapatkan kesalahan kembali E QUERY SyntaxError: Token tak terduga [ . Saya tidak yakin bagaimana ini bisa bekerja di node.js?
Vince Bowdren
Saya pikir alasannya adalah nodejs akan melakukan transformasi ketika berinteraksi dengan mongodb.
KiwenLau
ini bekerja pada drive mongodb asli untuk nodejs! Terima kasih!
Guihgo
Terima kasih! Ini bekerja dalam kode saya yang jauh lebih abstrak yang jawaban yang diterima tidak masuk akal (sebagai catatan, bereaksi bukan nodeJs).
adinutzyc21
7

Saya ingin mengklarifikasi bahwa jika Anda mencoba membuat kueri tentang bidang bersarang saja (bukan nilainya), seperti jika Anda ingin menanyakan bidang "nama" dari dokumen ini:

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

ini akan berfungsi (seperti dalam kasus saya - menggunakan pembaruan):

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

Cukup melampirkan [query]dalam tanda kurung memberi tahu mongodb bahwa itu bukan literal, melainkan sebuah jalur.

hydrix
sumber
2

gunakan seperti ini jika objeknya bersarang.

Objek langsung:-

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

Sebuah objek bertingkat: -

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
sumber
Ini membantu, saya menggunakan 'name.${surname}'tetapi untuk variabel kami tidak menggunakan ', terima kasih
1UC1F3R616