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.