จะใช้ตัวแปรเป็นชื่อฟิลด์ใน mongodb-native findOne () ได้อย่างไร?


89

ฉันมีข้อมูลนี้ใน mongodb:

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

และฉันต้องการดึงข้อมูลในขณะที่ส่งชื่อเขตข้อมูลเป็นตัวแปรในแบบสอบถาม

ต่อไปนี้ไม่ทำงาน:

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

ฉันจะสอบถาม mongodb โดยรักษาทั้งชื่อเขตข้อมูลและค่าแบบไดนามิกได้อย่างไร


เพิ่งเจอกระทู้นี้ ฉันคิดว่านี่มันไม่ปลอดภัยจริงๆ คุณไม่คิดว่าจะต้องฆ่าเชื้อก่อนที่จะใช้ค่าเหล่านั้นในแบบสอบถามหรือไม่?
McStuffins

คำตอบ:


142

คุณต้องตั้งค่าคีย์ของวัตถุแบบสอบถามแบบไดนามิก:

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

เมื่อคุณทำ{name: value}ที่สำคัญคือสตริงและไม่คุ้มค่าของตัวแปร'name'name


จะเกิดอะไรขึ้นหากคุณต้องการใช้ตัวดำเนินการเช่น $ gt ในข้อความค้นหา
Savvas Parastatidis

คุณแทนที่valueด้วยข้อความค้นหาของคุณเช่น{ $gt: 50 }
maxdec

วิธีการส่งแบบธรรมดาโดยใช้โซลูชัน var query ข้างต้น = {}; แบบสอบถาม [ชื่อ] = ค่า; เหรอ?
Rohit Luthra

3
ฉันประสบความสำเร็จ var query = {}; แบบสอบถาม ['registerNo'] = {"$ regex": sCode, "$ options": "m"};
Rohit Luthra

1
@levelone มีคนเร็วกว่าฉัน :)
maxdec

60

เพียงใส่ตัวแปรใน []

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

1
คำตอบของคุณตรงไปตรงมามาก!
user523234

1
สิ่งนี้ใช้ไม่ได้เป็นคำค้นหา mongo โดยตรง คุณได้รับข้อผิดพลาดกลับE QUERY SyntaxError: โทเค็นที่ไม่คาดคิด [ . ฉันไม่แน่ใจว่ามันจะทำงานใน node.js ได้อย่างไร?
Vince Bowdren

ฉันคิดว่าเหตุผลก็คือ nodejs จะทำการเปลี่ยนแปลงเมื่อมันโต้ตอบกับ mongodb
KiwenLau

งานนี้บนไดรฟ์ mongodb ดั้งเดิมสำหรับ nodejs! ขอบคุณ!
Guihgo

ขอขอบคุณ! สิ่งนี้ใช้ได้ผลในรหัสนามธรรมมากขึ้นของฉันซึ่งคำตอบที่ยอมรับนั้นไม่มีเหตุผล (สำหรับเร็กคอร์ดตอบสนองไม่ใช่ nodeJs)
adinutzyc21

7

ฉันต้องการชี้แจงว่าหากคุณกำลังพยายามสร้างข้อความค้นหาเกี่ยวกับฟิลด์ที่ซ้อนกันเท่านั้น (ไม่ใช่ค่าของฟิลด์นั้น) เช่นหากคุณต้องการค้นหาฟิลด์ "ชื่อ" จากเอกสารนี้:

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

สิ่งนี้จะใช้งานได้ (เช่นในกรณีของฉัน - ใช้การอัปเดต):

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

เพียงแค่ใส่[query]ในวงเล็บบอกว่า mongodb ไม่ใช่ตัวอักษร แต่เป็นเส้นทาง


3

ใช้เช่นนี้หากวัตถุซ้อนกัน

วัตถุโดยตรง: -

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

วัตถุซ้อนกัน: -

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

สิ่งนี้ช่วยได้ฉันใช้'name.${surname}'แต่สำหรับตัวแปรที่เราไม่ใช้ 'ขอบคุณ
1UC1F3R616
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.