Mongodb-native findOne () 'de bir değişken alan adı olarak nasıl kullanılır?


89

Bu verilere mongodb'de sahibim:

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

ve sorguda değişken olarak bir alan adı geçirirken verileri almak istiyorum.

Aşağıdaki çalışmıyor:

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

Mongodb'u hem alan adını hem de değerini dinamik tutarak nasıl sorgulayabilirim?


Bu gönderiyi yeni buldum. Bunun gerçekten güvensiz olduğunu düşünüyorum. Bu değerleri bir sorguda kullanmadan önce temizlemeniz gerektiğini düşünmüyor musunuz?
— McStuffins

Yanıtlar:


142

Sorgu nesnesinin anahtarını dinamik olarak ayarlamanız gerekir:

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

Bunu yaptığınızda {name: value}, anahtar 'name'değişkenin değeri değil dizedir name.


Ya sorgu içinde $ gt gibi işleçler kullanmak isterseniz?
— Savvas Parastatidis

valueSorgunuzla değiştirirsiniz{ $gt: 50 }
— maxdec

Yukarıdaki çözümü kullanarak normal ifade nasıl geçirilir var query = {}; sorgu [ad] = değer; ?
— Rohit Luthra

3
Başarılıyım var query = {}; sorgu ['registerNo'] = {"$ regex": sCode, "$ seçenekler": "m"};
— Rohit Luthra

1
@levelone birisi benden daha hızlıydı :)
— maxdec 21

60

Değişkeni [] içine koyun

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

1
Cevabınız çok açık!
— user523234

1
Bu, doğrudan bir mongo sorgusu olarak çalışmaz; Eğer bir hata geri almak Beklenmedik belirteç [: E QUERY SyntaxError . Node.js'de nasıl çalışacağından emin değilim?
— Vince Bowdren

Bence bunun nedeni, nodej'lerin mongodb ile etkileşime girdiğinde dönüşüm yapacak olmasıdır.
— KiwenLau

bu, nodej'ler için yerel mongodb sürücüsü üzerinde çalışıyor! Teşekkürler!
— Guihgo

Teşekkür ederim! Bu, kabul edilen cevabın hiçbir anlam ifade etmediği çok daha soyut kodumda çalıştı (kayıt için, nodeJ'lere tepki vermeyin).
— adinutzyc21

7

Bu belgedeki "ad" alanını sorgulamak istediğinizde olduğu gibi, yalnızca yuvalanmış bir alanla (değeriyle değil) ilgili bir sorgu yapmaya çalışıyorsanız açıklığa kavuşturmak isterim:

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

bu işe yarayacak (benim durumumda olduğu gibi - güncelleme kullanarak):

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

Basitçe [query]parantez içine almak mongodb'a bunun gerçek değil, bir yol olduğunu söyler.


2

nesne yuvalanmışsa bu şekilde kullanın.

Doğrudan nesne:-

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

Bir nesne yuvalanmış: -

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

Bu yardımcı oldu, kullanıyordum 'name.${surname}'ama değişken için kullanmıyoruz ', teşekkürler
— 1UC1F3R616
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.