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?


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.


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

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.


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

Ini membantu, saya menggunakan 'name.${surname}'tetapi untuk variabel kami tidak menggunakan ', terima kasih
1UC1F3R616
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.