2010-12-09 21 views
21

के साथ सॉर्ट() के लिए बहुत अधिक डेटा - मैं एक बड़ा संग्रह (300k + रिकॉर्ड्स) स्टोर करने के लिए MongoDB 1.6.3 का उपयोग कर रहा हूं। मैंने एक समग्र सूचकांक जोड़ा।MongoDB - कोई इंडेक्स त्रुटि

db['collection_name'].getIndexes() 
[ 
    { 
     "name" : "_id_", 
     "ns" : "db_name.event_logs", 
     "key" : { 
      "_id" : 1 
     } 
    }, 
    { 
     "key" : { 
      "updated_at.t" : -1, 
      "community_id" : 1 
     }, 
     "ns" : "db_name.event_logs", 
     "background" : true, 
     "name" : "updated_at.t_-1_community_id_1" 
    } 
] 
हालांकि

, जब मैं इस कोड चलाने की कोशिश: मैं हो रही है

db['collection_name'] 
    .find({:community_id => 1}) 
    .sort(['updated_at.t', -1]) 
    .skip(@skip) 
    .limit(@limit) 

:

मोंगो :: OperationFailure (बहुत अधिक डेटा प्रकार के लिए () कोई सूचकांक के साथ इंडेक्स जोड़ें या एक छोटी सी सीमा निर्दिष्ट करें)

मैं गलत क्या कर रहा हूँ?

उत्तर

14

{community_id: 1, 'updated_at.t': -1} अनुक्रमणिका जोड़ने का प्रयास करें। इसे पहले community_id द्वारा खोजना होगा और फिर क्रमबद्ध करें।

+2

सॉर्ट कॉलम इंडेक्स में अंतिम कॉलम होना चाहिए। http://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ#IndexingAdviceandFAQ-1.Thesortcolumnmustbethelastcolumnusedintheindex। –

4

तो यह "महसूस करता है" जैसे आप इंडेक्स का उपयोग कर रहे हैं, लेकिन सूचकांक वास्तव में एक समग्र सूचकांक है। मुझे यकीन नहीं है कि क्रम केवल आंशिक अनुक्रमणिका का उपयोग करने के लिए "पर्याप्त स्मार्ट" है।

तो दो समस्याओं:

  1. आपकी क्वेरी के आधार पर, मैं community_id सूचकांक, नहीं दूसरे के पहले भाग के रूप में रखा जाएगा। updated_at.t एक ऐसे क्षेत्र की तरह लगता है जिस पर आप रेंज क्वेरी करेंगे। रेंज क्वेरी दूसरी बिट है तो सूचकांक बेहतर काम करते हैं।
  2. community_id => 1 से कितनी प्रविष्टियां वापस आ रही हैं? यदि संख्या बड़ी नहीं है, तो आप बिना किसी इंडेक्स के सॉर्टिंग के साथ दूर हो सकते हैं।

तो तुम सूचकांक के आसपास स्विच करने के लिए हो सकता है और आप community_id और updated_at.t दोनों का उपयोग करने के प्रकार बदलने के लिए हो सकता है। मुझे पता है कि यह अनावश्यक लगता है, लेकिन वहां से शुरू करें और Google समूह की जांच करें यदि यह अभी भी काम नहीं कर रहा है।

2

यहां तक ​​कि एक इंडेक्स के साथ, मुझे लगता है कि यदि आपका परिणाम सेट 4 एमबी से अधिक हो तो भी आपको वह त्रुटि मिल सकती है।

आप MongoDB कंसोल में जा रहा है और ऐसा करके आकार देख सकते हैं:

show dbs 
# pick yours (e.g., production) 
use db-production 
db.articles.stats 

मैं इस तरह के परिणामों के साथ समाप्त हो गया:

{ 
"ns" : "mdalert-production.encounters", 
"count" : 89077, 
"size" : 62974416, 
"avgObjSize" : 706.9660630690302, 
"storageSize" : 85170176, 
"numExtents" : 8, 
"nindexes" : 6, 
"lastExtentSize" : 25819648, 
"paddingFactor" : 1, 
"flags" : 1, 
"totalIndexSize" : 18808832, 
"indexSizes" : { 
    "_id_" : 3719168, 
    "patient_num_1" : 3440640, 
    "msg_timestamp_1" : 2981888, 
    "practice_id_1" : 2342912, 
    "patient_id_1" : 3342336, 
    "msg_timestamp_-1" : 2981888 
}, 
"ok" : 1 
} 
0

एक कर्सर बैच का आकार है कि बहुत बड़ी है बीत रहा है इस त्रुटि का कारण बन जाएगा। बैच आकार सेट करना आपके द्वारा संसाधित किए जा सकने वाले डेटा की मात्रा को सीमित नहीं करता है, यह केवल डेटाबेस से कितना डेटा लाया जाता है, यह सीमित करता है। जब आप बैच सीमा को फिर से घुमाते हैं और हिट करते हैं, तो प्रक्रिया डेटाबेस के लिए एक और यात्रा करेगी।

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