2011-06-18 10 views
11

को महत्व देता है यह संभव है MongoDB में निम्नलिखित SQL क्वेरी व्यक्त करने के लिए:MongoDB क्षेत्र की तुलना द्वारा खोजने के

SELECT * FROM table AS t WHERE t.field1 > t.filed2; 

संपादित करें: संक्षेप में :.

  1. "फ़ील्ड 1 - फ़ील्ड 2" संग्रहित तीसरे क्षेत्र का उपयोग करके लगभग सही है, लेकिन थोड़ा अतिरिक्त रखरखाव की आवश्यकता है।
  2. $ जहां जावास्क्रिप्ट में लोड और eval होगा और किसी भी इंडेक्स का उपयोग नहीं करेगा। बड़े डेटा के लिए अच्छा नहीं है।
  3. नक्शा/को कम एक ही समस्या है और सभी रिकॉर्ड गर्त भले ही हम की जरूरत है केवल एक
+0

मैं एक लौ युद्ध लेकिन भगवान शुरू करने के लिए नहीं करना चाहते, मैं इतना NoSQL से नफरत है। – Blago

+1

तब इसका उपयोग न करें अगर आप नहीं जानते कि इसका उपयोग कहां और कैसे किया जाए। NoSQL संबंधपरक डेटाबेस के लिए एक प्रतिस्थापन नहीं है! –

+0

यह मेरी निराशा का स्रोत है। ज्यादातर लोग इसका संदर्भ देते हैं जैसे कि यह एक प्रतिस्थापन है। मैं पुरानी (रिलेशनल) बनाम आधुनिक (नोएसक्यूएल) डेटा स्टोर की लाइनों के साथ अधिक से अधिक तुलना देखता हूं। – Blago

उत्तर

17

आप $where का उपयोग कर ऐसा कर सकते हैं:

db.coll.find({ $where: "this.field1 > this.field2" }); 

लेकिन:

जावास्क्रिप्ट देशी ऑपरेटरों की तुलना में धीमी निष्पादित करता है, लेकिन यह बहुत लचीला है

हैं प्रदर्शन @yi_H द्वारा सुझाए गए तरीके से जाने के लिए एक मुद्दा बेहतर है।

+1

$ का उपयोग जहां कभी अनुशंसित नहीं है। Yi_H का जवाब सही है! –

+3

@ सेंटिनल: क्या आपने मतदान करने से पहले अंत में अपना जवाब पढ़ा है ????? मैंने कहा कि जावास्क्रिप्ट अतिरिक्त क्षेत्र बनाने के लिए धीमे और बेहतर काम कर रहा है क्योंकि @yi_H ने सुझाव दिया है। लेकिन किसी भी तरह से $ जहां ऑपरेटर मौजूद है, मुझे पूरी तरह से यकीन है कि कुछ स्थितियों में इसका उपयोग किया जा सकता है जब प्रदर्शन जारी नहीं होता है। –

+2

इसका उपयोग केवल तभी करें जब आपके पास एक छोटा संग्रह हो या अन्य शर्तों के साथ संग्रह को पूर्व-फ़िल्टर किया गया हो (जो अनुक्रमणिका का उपयोग करते हैं और संग्रह का एक छोटा उप-सेट वापस करते हैं)। मोंगो को पता नहीं है कि इस क्वेरी को कैसे तेज किया जाए और एक पूर्ण टेबल स्कैन निष्पादित किया जाएगा। –

15

आप अपने दस्तावेज़ में संग्रहीत कर सकती है field1 - field2field3 के रूप में, तो { field3: { $gt: 0 } }

यह भी करने के लिए संभव के लिए खोज जाना होगा मैप्रिडस के साथ मिलान दस्तावेज प्राप्त करें।

+7

मुझे यह उल्लेख करना चाहिए था कि आप बूलियन मान को स्टोर कर सकते हैं, जो प्रदर्शन के अनुसार बेहतर है। –

3

आप $$ का उपयोग कर सकते हैं। बस जागरूक रहें कि यह काफी धीमा होगा (प्रत्येक रिकॉर्ड पर जावास्क्रिप्ट कोड निष्पादित करना होगा) इसलिए यदि आप कर सकते हैं तो अनुक्रमित प्रश्नों के साथ गठबंधन करें।

db.T.find({ $where: function() { return this.Grade1 > this.Grade2 } }); 

या अधिक कॉम्पैक्ट:

db.T.find({ $where : "this.Grade1 > this.Grade2" }); 
संबंधित मुद्दे