2012-02-29 17 views
6

मुझे कुछ डेटा स्टोर करने की ज़रूरत है जो अनिवार्य रूप से दिनांक/इंक की कुंजी-मूल्य जोड़े की एक सरणी है, जहां तिथियां हमेशा अद्वितीय होंगी।MongoDB - क्या एसोसिएटिव सरणी कुंजी द्वारा क्वेरी करना संभव है?

मैं एक साहचर्य सरणी है जैसे कि यह स्टोर करने के लिए सक्षम होने के लिए करना चाहते हैं:।

array(
    "2012-02-26" => 5, 
    "2012-02-27" => 2, 
    "2012-02-28" => 17, 
    "2012-02-29" => 4 
) 

लेकिन मैं यह भी दिनांक क्वेरी करने के लिए सक्षम होना चाहिए (यानी सब कुछ प्राप्त जहां तिथि> 2012-02-27), और इसलिए संदेह है कि मैं और अधिक की तरह एक स्कीमा का उपयोग करना होगा:

array(
    array("date"=>"2012-02-26", "value"=>5), 
    array("date"=>"2012-02-27", "value"=>2), 
    array("date"=>"2012-02-28", "value"=>17), 
    array("date"=>"2012-02-29", "value"=>4), 
) 

जाहिर है पूर्व अधिक स्वच्छ और अधिक संक्षिप्त है, लेकिन मैं जिस तरह से है कि मैं चाहता हूँ में यह क्वेरी करने के लिए सक्षम हो जाएगा, और यदि कोई अन्य स्कीमा नहीं है जो अधिक उपयुक्त हो सकता है?

+0

http://www.php.net/manual/en/mongo.queries.php –

+0

मैं उस प्रारूप में तिथियों को संग्रहीत नहीं करता। समय का उपयोग करें(); समारोह। यह तिथियों को क्रमबद्ध करना आसान बना देगा। http://php.net/manual/en/function.time।php –

उत्तर

10

आपने दो विधियों का वर्णन किया है, मुझे उन्हें तोड़ने दें।

विधि # 1 - साहचर्य सरणी

"साहचर्य सरणी" द्वारा क्वेरी करने के लिए महत्वपूर्ण उपकरण $exists ऑपरेटर है। Here ऑपरेटर पर विवरण हैं।

तो आप निश्चित रूप से निम्नलिखित की तरह एक प्रश्न चला सकते हैं:

db.coll.find({ $exists: { 'field.2012-02-27' } }); 

अपने विवरण के आधार पर आप रेंज प्रश्नों जो $exists ऑपरेटर के साथ अच्छी तरह से मेल नहीं खाती है के लिए देख रहे हैं। "एसोसिएटिव सरणी" संस्करण इंडेक्स करना भी मुश्किल है।

विधि # 2 - वस्तुओं की सरणी

यह निश्चित रूप से है बेहतर से क्वेरी कार्यक्षमता:

db.coll.find({ 'field.date': { $gt: '2012-02-27' } }); 

यह भी सूचीबद्ध किए जा सकते

db.coll.ensureIndex({ 'field.date': 1 }); 

हालांकि, वहाँ एक व्यापार में है अद्यतन पर बंद करें। यदि आप किसी विशिष्ट तिथि के लिए मान को बढ़ाना चाहते हैं तो आपको इस अनावश्यक $ स्थितित्मक ऑपरेटर का उपयोग करना होगा। यह वस्तुओं की एक सरणी के लिए काम करता है, लेकिन यह आगे घोंसले के साथ कुछ भी विफल रहता है।

अन्य मुद्दों इन तरीकों में से किसी के साथ

एक मुद्दा डेटा के दीर्घकालिक विकास है। जैसे ही आप ऑब्जेक्ट आकार का विस्तार करते हैं, यह डिस्क और मेमोरी में अधिक जगह लेगा। यदि आपके पास दो साल के डेटा के साथ कोई ऑब्जेक्ट है, तो आज के लिए डेटा अपडेट करने के लिए 700 आइटमों की पूरी सरणी में स्मृति की आवश्यकता होगी। यह आपके विशिष्ट डेटा के लिए कोई मुद्दा नहीं हो सकता है, लेकिन इसे माना जाना चाहिए।

उसी नस में, मोंगोडीबी प्रश्न हमेशा शीर्ष-स्तर की वस्तु को वापस कर देते हैं। दोबारा, यदि आपके पास 700 आइटमों की एक सरणी है, तो आप उन सभी दस्तावेज़ों के लिए उन सभी को प्राप्त करेंगे जो मेल खाते हैं। लौटाए गए फ़ील्ड को फ़िल्टर करने के तरीके हैं, लेकिन वे "ऑब्जेक्ट्स के सरणी" के लिए काम नहीं करते हैं।

+0

'यदि आपके पास दो साल के डेटा के साथ कोई ऑब्जेक्ट है, तो आज के लिए डेटा अपडेट करने के लिए 700 आइटमों की पूरी सरणी मेमोरी में होनी चाहिए - अगर मैं सबसेट को हटाने के लिए' $ स्लाइस 'का उपयोग करना चाहता हूं तो क्या होगा एक सरणी में एक नया आइटम जोड़ने के लिए सरणी और '$ push' का? –

+0

तो यह डेटा लौटने के लिए काम करता है, लेकिन केवल तभी जब आप डेट ऑर्डर में धक्का देते हैं। हालांकि, सर्वर की तरफ, इसे अभी भी पूरे ऑब्जेक्ट को स्मृति में खींचने की आवश्यकता है भले ही यह केवल आपको इसका एक टुकड़ा पास करे। –

+0

ओह ठीक है मुझे एहसास नहीं हुआ, मुझे लगा कि यह केवल निर्दिष्ट सबसेट को हटाने के लिए पर्याप्त स्मार्ट था। यह मेरी वर्तमान परियोजना के लिए एक डीलरब्रेकर है, मुझे लाइन के नीचे 6 महीने और इसे महसूस करने के लिए धन्यवाद! –

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^