Làm cách nào để sử dụng một biến làm tên trường trong mongodb-native findOne ()?


88

Tôi có dữ liệu này trong mongodb:

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

và tôi muốn truy xuất dữ liệu trong khi chuyển tên trường làm biến trong truy vấn.

Sau đây không hoạt động:

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

Làm cách nào để truy vấn mongodb giữ động cả tên trường và giá trị của nó?


Chỉ cần tìm thấy bài đăng này. Tôi nghĩ rằng điều này thực sự không an toàn. Bạn có nghĩ rằng bạn nên khử trùng trước khi sử dụng các giá trị đó trong một truy vấn không?
McStuffins

Câu trả lời:


140

Bạn cần đặt động khóa của đối tượng truy vấn:

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

Khi bạn làm như vậy {name: value}, chìa khóa là chuỗi 'name'chứ không phải giá trị của biến name.


Điều gì xảy ra nếu bạn muốn sử dụng các toán tử như $ gt bên trong truy vấn?
Savvas Parastatidis

Bạn thay thế valuebằng truy vấn của mình như{ $gt: 50 }
maxdec

Cách chuyển thông thường express bằng giải pháp trên var query = {}; truy vấn [tên] = giá trị; ?
Rohit Luthra

3
Tôi thành công var query = {}; query ['registerNo'] = {"$ regex": sCode, "$ options": "m"};
Rohit Luthra

1
@levelone ai đó nhanh hơn tôi :)
maxdec

57

Chỉ cần đặt biến vào []

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

1
Câu trả lời của bạn rất dễ hiểu!
user523234

1
Điều này không hoạt động như một truy vấn mongo trực tiếp; bạn gặp lỗi trở lại E QUERY Cú pháp Lỗi: Mã thông báo không mong muốn [ . Tôi không chắc nó có thể hoạt động như thế nào trong node.js?
Vince Bowdren

Tôi nghĩ lý do là nodejs sẽ thực hiện chuyển đổi khi nó tương tác với mongodb.
KiwenLau

cái này hoạt động trên ổ mongodb gốc cho nodejs! Cảm ơn!
Guihgo

Cảm ơn bạn! Điều này hoạt động trong mã trừu tượng hơn của tôi mà câu trả lời được chấp nhận không có ý nghĩa gì (đối với bản ghi, phản ứng không phải nodeJs).
adinutzyc21

7

Tôi muốn làm rõ rằng nếu bạn đang cố gắng thực hiện một truy vấn chỉ liên quan đến một trường lồng nhau (không phải giá trị của nó), chẳng hạn như nếu bạn muốn truy vấn trường "tên" từ tài liệu này:

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

điều này sẽ hoạt động (như trong trường hợp của tôi - sử dụng bản cập nhật):

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

Đơn giản chỉ cần đặt [query]trong dấu ngoặc đơn cho mongodb biết rằng nó không phải theo nghĩa đen, mà là một đường dẫn.


2

sử dụng như thế này nếu đối tượng được lồng vào nhau.

Đối tượng trực tiếp:-

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

Một đối tượng được lồng vào nhau: -

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

Điều này đã hữu ích, tôi đang sử dụng 'name.${surname}'nhưng đối với biến chúng tôi không sử dụng ', cảm ơn
1UC1F3R616
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.