2011-06-12 6 views
9

मेरे पास ~ 4 एम तत्वों के साथ एक मोंगोडीबी संग्रह है।एक बड़े MongoDB संग्रह w/PHP से प्रत्येक एनएच तत्व का चयन?

मैं उन तत्वों की एक्स संख्या को पकड़ना चाहता हूं, जो पूरे संग्रह के माध्यम से समान रूप से दूरी पर हैं।

उदा। संग्रह से 1000 तत्व प्राप्त करें - प्रत्येक 4000 पंक्तियों में से एक।

अभी, मुझे कर्सर में पूरा संग्रह मिल रहा है और फिर केवल प्रत्येक एनएच तत्व लिख रहा है। यह मुझे मुझे जो चाहिए वह देता है लेकिन विशाल संग्रह के मूल भार में काफी समय लगता है।

क्या ऐसा करने का कोई आसान तरीका है? अभी मेरा अनुमानित दृष्टिकोण मॉड्यूलस के साथ एक बढ़ी हुई इंडेक्स संपत्ति पर जेएस क्वेरी करना है। इस का एक पीएचपी कार्यान्वयन:

db.collection.find({i:{$mod:[10000,0]}})

लेकिन यह लगता है जैसे कि यह शायद बस के रूप में ज्यादा समय क्वेरी को चलाने के लिए ले जाएगा।

Jer

+0

क्या आपको कोई समाधान मिला? –

उत्तर

0

मुझे लगता है कि मुख्य समस्या यह है कि संग्रह सर्वर पर वितरित किया जा सकता है और इस तरह आप पूरे संग्रह से अधिक पुनरावृति करने के लिए है है।

+0

इस मामले में मैं पूरी चीज को स्थानीय सर्वर पर चला रहा हूं। – blprnt

0

पूरे डेटासेट को कर्सर में न डालें। चूंकि पंक्ति क्रम महत्वपूर्ण नहीं है, इसलिए केवल कुल मिलाकर एक्स यादृच्छिक पंक्तियां एकत्र करें, परिणामस्वरूप लौटें और फिर उन रिकॉर्ड्स को संशोधित करें

+0

समस्या यह है कि मुझे अपने संग्रह से समान रूप से वितरित तत्वों की आवश्यकता है - यानी प्रत्येक 1000 वें तत्व। – blprnt

+0

एक गिनती फ़ील्ड बनाएं, फिर प्रत्येक एनएच तत्व को फ़िल्टर करने के लिए मानचित्र का उपयोग करें, फिर उस रिकॉर्ड पर काम करने के लिए कम करें –

+0

धन्यवाद ... यह एक कोशिश करेगा। मेरे पास पहले से ही एक गिनती क्षेत्र है। मानचित्र के सिर/पूंछ बनाने के लिए बस दस्तावेज़ों को कम करने की कोशिश करने की आवश्यकता है। – blprnt

0

व्यक्तिगत रूप से मैं "मॉड्यूलस" मान में डिज़ाइन करता हूं, इसे किसी फ़ंक्शन के साथ पॉप्युलेट करता हूं डेटा के प्रतिनिधि - इसलिए यदि आपका डेटा पूरे दिन एक नियमित अंतराल डाला गया था, तो आप समय के मॉड्यूलस कर सकते हैं, अगर कुछ भी अनुमानित नहीं है तो आप यादृच्छिक मूल्य का उपयोग कर सकते हैं; उस आकार के संग्रह के साथ यह वितरण को बहुत तेज़ी से बदल देगा।

एक यादृच्छिक मूल्य का उपयोग कर एक उदाहरण ...

// add the index 
    db.example.ensureIndex({modulus: 1}); 
    // insert a load of data 
    db.example.insert({ your: 'data', modulus: Math.round((Math.random() * 1000) % 1000) }); 
    // Get a 1/1000 of the set 
    db.example.find({modulus: 1}); 
    // Get 1/3 of the set 
    db.example.find({modulus: { $gt: 0, $lt: 333 }}); 
-4

अगर केवल अपने डेटा एक SQL डेटाबेस में था, के रूप में यह होना चाहिए, ... इस सवाल पीएचपी में नहीं होगा और जवाब होगा इतना आसान और त्वरित हो ...

सीधे डीबी में जानकारी की गणना करने के बजाय कर्सर में कुछ भी लोड करना निश्चित रूप से एक बुरा विचार है, क्या यह सीधे मोंगोडीबी चीज़ में ऐसा करना संभव नहीं है?

+0

यह उत्तर इतना पीछे है – jtromans

+0

केवल 4 एम तत्वों को संभालने और संचालन करने वाले जो मोंगोडीबी के मूल निवासी नहीं हैं, आपको PostgreSQL का उपयोग करना चाहिए। –

+0

क्यों?PostgreSQL यहाँ बेहतर क्यों होगा? मैं एसक्यूएल डेटाबेस का एक भारी उपयोगकर्ता हूं लेकिन अधिकांश डेटाबेस के लिए इस प्रकार की क्वेरी खराब है। इसके अलावा, "MongoDB चीज़"? ऐसा लगता है कि आपको वास्तव में पता नहीं है कि मोंगो डीबी के साथ आप किसके बारे में बात कर रहे हैं। यह भी सुनिश्चित नहीं है कि आपके उत्तर के दूसरे भाग से आपका क्या मतलब है। – Sammaye

0

क्या यह मानचित्र को कम करने के लिए एक सही उपयोग केस नहीं होगा?

+0

मोटी होने के लिए माफ़ी, लेकिन कुछ मेटा कोड/वास्तविक कोड यह दर्शाता है कि यह कैसे किया जा सकता है इसकी सराहना की जाएगी। धन्यवाद। प्रश्न का उत्तर नहीं देने के लिए –

+2

-1, यह एक टिप्पणी होनी चाहिए – y3sh

0

ऐसा करने के लिए एक सरल (अक्षम) तरीका एक धारा के साथ है।

var stream = collection.find({}).stream(); 
var counter = 0; 

stream.on("data", function (document) { 
    counter++; 

    if (counter % 10000 == 0) { 
    console.log(JSON.stringify(document, null, 2)); 
    //do something every 10,000th time 
    } 
}); 
संबंधित मुद्दे