2011-12-20 11 views
6

मैं कई समवर्ती प्रक्रियाओं में MongoDB में FindAndModify का उपयोग कर रहा हूं। संग्रह का आकार लगभग 3 मिलियन प्रविष्टियां है और जब तक मैं एक सॉर्टिंग विकल्प (अनुक्रमित फ़ील्ड द्वारा) पास नहीं करता तब तक सब कुछ विस्फोट की तरह काम करता है। एक बार मैं ऐसा करने के लिए प्रयास करें, निम्न चेतावनी लॉग के लिए पैदा की है:MongoDB FindAndModify सॉर्टिंग

warning: ClientCursor::yield can't unlock b/c of recursive lock ns: test_db.wengine_queue top: 
{ 
opid: 424210, 
active: true, 
lockType: "write", 
waitingForLock: false, 
secs_running: 0, 
op: "query", 
ns: "test_db", 
query: { 
    findAndModify: "wengine_queue", 
    query: { 
      locked: { $ne: 1 }, 
      rule_completed: { $in: [ "", "0", null ] }, 
      execute_at: { $lt: 1324381363 }, 
      company_id: 23, 
      debug: 0, 
      system_id: "AK/AK1201" 
     }, 
    update: { 
      $set: { locked: 1 } 
     }, 
    sort: { 
      execute_at: -1 
     } 
}, 
client: "127.0.0.1:60873", 
desc: "conn", 
threadId: "0x1541bb000", 
connectionId: 1147, 
numYields: 0 
} 

मैं क्वेरी अनुक्रमित से सभी चाबियाँ है, यहाँ वे हैं:

PRIMARY> db.wengine_queue.getIndexes() 
[ 
{ 
    "v" : 1, 
    "key" : { 
     "_id" : 1 
    }, 
    "ns" : "test_db.wengine_queue", 
    "name" : "_id_" 
}, 
{ 
    "v" : 1, 
    "key" : { 
     "system_id" : 1, 
     "company_id" : 1, 
     "locked" : 1, 
     "rule_completed" : 1, 
     "execute_at" : -1, 
     "debug" : 1 
    }, 
    "ns" : "test_db.wengine_queue", 
    "name" : "system_id_1_company_id_1_locked_1_rule_completed_1_execute_at_-1_debug_1" 
}, 
{ 
    "v" : 1, 
    "key" : { 
     "debug" : 1 
    }, 
    "ns" : "test_db.wengine_queue", 
    "name" : "debug_1" 
}, 
{ 
    "v" : 1, 
    "key" : { 
     "system_id" : 1 
    }, 
    "ns" : "test_db.wengine_queue", 
    "name" : "system_id_1" 
}, 
{ 
    "v" : 1, 
    "key" : { 
     "company_id" : 1 
    }, 
    "ns" : "test_db.wengine_queue", 
    "name" : "company_id_1" 
}, 
{ 
    "v" : 1, 
    "key" : { 
     "locked" : 1 
    }, 
    "ns" : "test_db.wengine_queue", 
    "name" : "locked_1" 
}, 
{ 
    "v" : 1, 
    "key" : { 
     "rule_completed" : 1 
    }, 
    "ns" : "test_db.wengine_queue", 
    "name" : "rule_completed_1" 
}, 
{ 
    "v" : 1, 
    "key" : { 
     "execute_at" : -1 
    }, 
    "ns" : "test_db.wengine_queue", 
    "name" : "execute_at_-1" 
}, 
{ 
    "v" : 1, 
    "key" : { 
     "thread_id" : 1 
    }, 
    "ns" : "test_db.wengine_queue", 
    "name" : "thread_id_1" 
}, 
{ 
    "v" : 1, 
    "key" : { 
     "rule_id" : 1 
    }, 
    "ns" : "test_db.wengine_queue", 
    "name" : "rule_id_1" 
} 
] 

वहाँ के आसपास कोई तरीका है इस?

+0

यह केवल एक चेतावनी है जो कहता है कि अद्यतन उपज नहीं कर सकता है। क्या वास्तव में कुछ भी काम करना बंद कर देता है या क्या आप चेतावनी के बारे में चिंतित हैं? मोंगो डीबी/10gen के बारे में कुछ अलग राय है कि लॉग इन चेतावनी क्या होनी चाहिए और क्यों नहीं होना चाहिए ताकि आप चेतावनी के रूप में लॉग इन होने वाली कुछ चीजों के साथ समाप्त हो जाएं, शायद –

+0

नहीं, सबकुछ ठीक काम करता है। मैं चेतावनी के बारे में चिंतित हूं और इसके प्रभावों के बारे में चिंतन है जब मेरा सेटअप उत्पादन (लगभग 50 मिलीलीटर दस्तावेज) – clops

+0

पर अपेक्षाकृत निर्दोष है। मैं एक उत्तर पोस्ट करूंगा –

उत्तर

4

रुचि रखने वालों के लिए - मुझे उस कुंजी के साथ समाप्त होने वाली एक अलग इंडेक्स बनाना था जिसे सेट को सॉर्ट करना है।

+1

मोंगोडीबी दस्तावेज कहता है ["सॉर्ट कॉलम इंडेक्स में इस्तेमाल किया जाने वाला अंतिम कॉलम होना चाहिए"] (http://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ#IndexingAdviceandFAQ-1.Thesortcolumnmustbethelastcolumnusedintheindex।) –

+0

@AlexanderAzarov अब यह ऐसा नहीं लगता है। वास्तव में – bmargulies

+1

। अब यह कहता है ["उन प्रश्नों के लिए जिनमें एक कंपाउंड इंडेक्स का उपयोग करने वाला एक प्रकार शामिल है, सुनिश्चित करें कि पहले क्रमबद्ध फ़ील्ड से पहले सभी फ़ील्ड समानता मिलान हैं"] (http://docs.mongodb.org/manual/applications/indexes/#use -indexes-टू-तरह-प्रश्न-परिणाम) –

1

यह चेतावनी तब फेंक दी जाती है जब कोई ऑपरेशन जो उपज करना चाहता है (जैसे लंबे अपडेट, हटाने, आदि) ऐसा नहीं कर सकते क्योंकि यह किसी भी कारण से लॉक को बंद नहीं कर सकता है।

क्या आपके पास अनुक्रमित क्रमबद्ध क्षेत्र है? यदि इसके लिए कोई इंडेक्स नहीं जोड़ना शायद चेतावनियों को हटा देगा।

+0

हां, फ़ील्ड को अनुक्रमित किया गया है जैसा कि आप – clops

+0

से ऊपर "getIndexes()" के परिणाम से देख सकते हैं। उस स्थिति में आपको मुझे लगता है कि चेतावनी के साथ रहना होगा। दोबारा, यह केवल एक लंबे अद्यतन का परिणाम है जो उपज करना चाहता है लेकिन नहीं कर सकता। वैसे वहाँ एक या दो बेकार इंडेक्स हैं। ध्यान दें कि अनुक्रमणिका {ए: 1, बी: 1, सी: 1} और {ए: 1} उपयोगी नहीं हैं क्योंकि पूर्व में बाद वाले शामिल हैं। –

+0

तो आप सुझाव देते हैं कि मैं सिर्फ कंपाउंड इंडेक्स रखूं? अन्य परिचालनों के बारे में क्या है जो केवल "सी" या "बी" और "सी" का उपयोग कर सकते हैं? – clops