2013-03-14 11 views
15

में db.eval() का मोंगोडीबी प्रदर्शन दस्तावेज़ों पर अद्यतन संचालन करने की आवश्यकता है जिसमें मुझे किसी सरणी में कुछ मान घुमाने की आवश्यकता है। मोंगोडीबी अपडेट क्वेरी वर्तमान में आपको $pop और फिर $push अपडेट में उसी फ़ील्ड पर अनुमति नहीं देती है। ऑनलाइन सलाह के बाद, मैंने फैसला किया कि db.eval() मेरे उपयोग के लिए सबसे उपयुक्त होगा क्योंकि यह परमाणुता सुनिश्चित करता है और जो ऑपरेशन मैं कर रहा हूं वह बहुत छोटा है, इसलिए यह बहुत लंबे समय तक डीबी को लॉक नहीं करेगा।जावास्क्रिप्ट खोल बनाम pymongo

यहाँ कुछ का एक उदाहरण मैं ऐसा करने की कोशिश कर रहा हूँ:

db.eval(function (id, newVal) { 
    doc = db.collection.findOne({_id: id}); 
    doc.values.shift(); 
    doc.values.push(newVal); 
    db.collection.save(doc); 
}, id, newVal); 

और यह पूरी तरह से काम करता है! मैं तो MongoDB देखने के लिए कितने मिलीसेकेंड eval() आदेश ले रहा था की रूपरेखा सक्षम है और मैं हमेशा कम है कि 1 millisecond के परिणाम प्राप्त करेंगे:

> db.system.profile.find({op: "command"}, {"millis": 1}) 
{ "millis" : 0 } 
{ "millis" : 0 } 
... 

यह सिवाय इसके कि अपने आवेदन अजगर में है, मेरे लिए अच्छी खबर है, तो मैं eval() आदेशों को करने के लिए एक पिमोंगो क्लाइंट का उपयोग कर रहा हूं। , अब (ऊपर डेटा मोंगो खोल से है) लेकिन जब मैं pymongo का उपयोग कर समान eval() कमांड चलाने:

conn = pymongo.Connection(mongo_server_hostname) 
db = conn.my_db 

db.eval("""function (id, newVal) { 
    doc = db.collection.findOne({_id: id}); 
    doc.values.shift(); 
    doc.values.push(newVal); 
    db.collection.save(doc); 
}""", id, new_val) 

मैं बहुत अलग रूपरेखा परिणाम प्राप्त:

> db.system.profile.find({op: "command"}, {"millis": 1}) 
{ "millis" : 13 } 
{ "millis" : 14 } 
{ "millis" : 14 } 
... 

वहाँ कुछ मौलिक चलाने के बारे में अलग अलग है उसी eval() मोंगो शैल और पिमोंगो के भीतर से आदेश देता है जिसके परिणामस्वरूप सर्वर पिमोंगो से समान आदेश चलाने के लिए 14ms अधिक लेता है?

+2

क्या आप अपना पाइथन कोड समतुल्य समझा सकते हैं? आप पिमोंगो से eval कैसे बुला रहे हैं? क्या यह उसी प्रकार के 'eval' ताले खोल लेता है जो खोल लेता है? – WiredPrairie

+0

प्रश्न संपादित किया गया। मुझे लगता है कि एक ही eval कमांड में pymongo eval() परिणाम। जो कुछ भी मैंने पार नहीं किया है, वह मुझे अन्यथा विश्वास करने के लिए प्रेरित करता है। – jlhawn

+0

आपके मोंगोडीबी और पायमोंगो संस्करण क्या हैं? उत्तर writeconcern सेटिंग्स में हो सकता है ... –

उत्तर

1

एक संभावित कारण (लेकिन जरूरी नहीं कारण) विसंगति है कि आप देख रहे हैं के लिए है कि दोनों mongo खोल और डिफ़ॉल्ट (हालांकि यह एक विकल्प के रूप Spidermonkey उपयोग करने के लिए विन्यस्त किया जा सकता) द्वारा mongod सर्वर use Google's v8 Javascript engine के लिए आपके द्वारा दिए गए आदेशों की व्याख्या करना।

Google का v8 जावास्क्रिप्ट कोड में हॉटस्पॉट देखता है और अक्सर जेआईटी कोड की संभावना होती है जिसका उपयोग अक्सर किया जाता है।

दूसरी ओर, वेनिला पायमोंगो written in pure Python है, जिसका अर्थ है कि इसका हमेशा व्याख्या किया जाएगा, जो कुछ ऐसा है जो काफी ऊपरी है।

यदि आप पहले से ऐसा नहीं कर रहे हैं, तो एक संभावना डिफ़ॉल्ट रूप से PyMongo extension written in C का उपयोग करना होगा, या यदि आपका शेष एप्लिकेशन संगत है, तो पाइथन के लिए पीपीपी जेआईटी दुभाषिया का उपयोग करें।

यदि आप डेबियन (उबंटू) से व्युत्पन्न किसी भी वितरण का उपयोग करते हैं, तो पैकेज python-pymongo-ext आपको पायमोंगो के सी संस्करण का प्रीकंपिल्ड संस्करण प्रदान करता है।

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