कैसे एक चर नाम के रूप में mongodb- देशी findOne () में उपयोग करें?


88

मेरे पास यह डेटा मोंगोडब में है:

{  
    "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);
});

मैं फ़ील्ड के नाम और उसके मूल्य को गतिशील रखते हुए मोंगोडब को कैसे क्वेरी कर सकता हूं?


बस इस पोस्ट को मिला। मुझे लगता है कि यह वास्तव में असुरक्षित है। क्या आपको नहीं लगता कि क्वेरी में उन मूल्यों का उपयोग करने से पहले आपको स्वच्छता करना चाहिए?
McStuffins

जवाबों:


140

आपको क्वेरी ऑब्जेक्ट की कुंजी को गतिशील रूप से सेट करने की आवश्यकता है:

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 जैसे ऑपरेटरों का उपयोग करना चाहते हैं?
सवावास परस्तातिदिस

आप valueअपनी क्वेरी से बदल देते हैं{ $gt: 50 }
अधिकतम

उपरोक्त समाधान var क्वेरी = {} का उपयोग करके नियमित एक्सप्रेस पास कैसे करें; क्वेरी [नाम] = मूल्य; ?
रोहित लूथरा

3
मैं var क्वेरी = {} को सफल करता हूं; क्वेरी ['पंजीकरण नहीं'] = {"$ रेगेक्स": sCode, "$ विकल्प": "एम"};
रोहित लूथरा

1
@ लेवलोन कोई मुझसे तेज था :)
मैक्सडेक

57

बस चर में डाल []

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

1
आपका उत्तर बहुत सीधा है!
user523234

1
यह प्रत्यक्ष मानगो क्वेरी के रूप में काम नहीं करता है; आपको एक त्रुटि मिलती है E QUERY SyntaxError: अप्रत्याशित टोकन [ । मुझे यकीन नहीं है कि यह नोड.जेएस में कैसे काम कर सकता है?
विंस बॉउड्रेन

मुझे लगता है कि इसका कारण यह है कि नोडज परिवर्तन तब करेंगे जब यह मोनोडब के साथ बातचीत करेगा।
कीवेनलाऊ

नोडज के लिए देशी मोंगोडब ड्राइव पर यह काम! धन्यवाद!
गुहिगो

धन्यवाद! इसने मेरे बहुत अधिक सार कोड में काम किया जिसके लिए स्वीकृत उत्तर का कोई मतलब नहीं था (रिकॉर्ड के लिए, प्रतिक्रिया नहीं नोडज)।
adinutzyc21

7

मैं स्पष्ट करना चाहूंगा कि यदि आप एक नेस्टेड फ़ील्ड से संबंधित एक क्वेरी बनाने की कोशिश कर रहे हैं (केवल इसका मूल्य नहीं), जैसे कि आप इस दस्तावेज़ से फ़ील्ड "नाम" को क्वेरी करना चाहते हैं:

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

यह काम करेगा (मेरे मामले में - अपडेट का उपयोग करके):

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

बस [query]ब्रैकेट्स में संलग्न होने से मोंगोडब बताता है कि यह शाब्दिक नहीं है, बल्कि एक मार्ग है।


2

ऑब्जेक्ट नेस्टेड है तो इस तरह का उपयोग करें।

प्रत्यक्ष वस्तु:-

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.