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.