2014-08-28 6 views
14

सबसे पहले, मैं मोंगोडब के लिए काफी नया हूं। मेरा प्रश्न यह है कि मैं समाधान ढूंढने में सक्षम नहीं हूं।सभी मोंगो संग्रहों के माध्यम से लूप और क्वेरी निष्पादित करें

मान लें कि मेरे पास 3 अलग-अलग संग्रह हैं।

mongos> show collections 
collectionA 
collectionB 
collectionC 

मैं एक स्क्रिप्ट है कि इस डेटाबेस इंडस्ट्रीज़ सभी संग्रह से अधिक iterates बना सकते हैं और इन संग्रहों में से प्रत्येक में पिछले डाला टाइमस्टैम्प लगाना चाहते हैं। यहां मोंगो के अंदर क्या काम करता है।

var last_element = db.collectionA.find().sort({_id:-1}).limit(1); 
printjson(last_element.next()._id.getTimestamp()); 
ISODate("2014-08-28T06:45:47Z") 

1. समस्या (सभी संग्रह से अधिक दोहराएं)

वहाँ sth करने के लिए किसी भी संभावना है। पसंद।

var my_collections = show collections; 
my_collections.forEach(function(current_collection){ 
    print(current_collection); 
}); 

समस्या यहां, my_collections के लिए असाइनमेंट काम नहीं करता है। मुझे SyntaxError: Unexpected identifier मिलता है। क्या मुझे 'शो' कथन उद्धृत करने की ज़रूरत है? क्या यह भी संभव है?

2. समस्या (जे एस वर में संग्रह भंडारण)

मैं समस्या 1 वैकल्पिक हल कर सकते हैं ऐसा करने से:

var my_collections = ["collectionA", "collectionB", "collectionC"]; 
my_collections.forEach(function(current_collection){ 
    var last_element = db.current_collection.find().sort({_id:-1}).limit(1); 
    print(current_collection); 
    printjson(last_element.next()._id.getTimestamp()); 
}); 

last_element.next() निम्न त्रुटि पैदा करता है:

error hasNext: false at src/mongo/shell/query.js:124

ऐसा लगता है कि last_element सही ढंग से सहेजा नहीं गया है।

मैं क्या गलत कर रहा हूं पर कोई सुझाव ??


अद्यतन

नील्स जवाब मुझे इस समाधान के लिए सीसा। उसके कोड के अलावा मुझे यह जांचना पड़ा कि फ़ंक्शन getTimestamp वास्तव में मौजूद है या नहीं। कुछ 'आभासी' संग्रहों के लिए कोई _id संपत्ति प्रतीत नहीं होती है।

db.getCollectionNames().forEach(function(collname) { 
    var last_element = db[collname].find().sort({_id:-1}).limit(1); 
    if(last_element.hasNext()){ 
     var next = last_element.next(); 
     if(next._id !== undefined && typeof next._id.getTimestamp == 'function'){ 
      printjson(collname + " >> "+next._id.getTimestamp()); 
     }else{ 
      print(collname + " undefined!! (getTimestamp N/A)") 
     } 
    } 
}); 
+1

बस यहां स्पष्ट करने के लिए। एकमात्र कारण '.getTimeStamp()' यहां विफल होगा यह है कि आपके पास वास्तव में प्रत्येक दस्तावेज़ में प्राथमिक कुंजी '_id' फ़ील्ड में 'ऑब्जेक्ट आईडी' नहीं है। आपको ** वास्तव में यह देखना चाहिए, भले ही मोंगोडीबी आपको "स्कीमलेस" के रूप में फ़ील्ड में प्रकारों को मिश्रण करने की अनुमति दे, ** आपको ** सामान्य अभ्यास के रूप में ऐसा नहीं करना चाहिए और वास्तव में इसे ठीक करना चाहिए जहां प्रविष्टियां सुसंगत बनाने के लिए होती है। –

+0

उस नोटिस के लिए धन्यवाद! जैसा कि कहा गया है कि मैं मोंगो के लिए काफी नया हूं और एक रिलेशनल डीबी पृष्ठभूमि से आया हूं। मुझे अभी भी यकीन नहीं है कि ये संग्रह कैसे बनाए गए थे और न ही उनके पास कोई ऑब्जेक्ट आईडी क्यों है। जैसा कि आपने कहा है कि मुझे इसे सही करने की आवश्यकता होगी और क्यों और कैसे समझने की आवश्यकता है। धन्यवाद! – cb0

उत्तर

25

db.getCollectionNames() सहायक विधि है कि आप के लिए यह करता है।

db.getCollectionNames().forEach(function(collname) { 
    // find the last item in a collection 
    var last_element = db[collname].find().sort({_id:-1}).limit(1); 
    // check that it's not empty 
    if (last_element.hasNext()) { 
     // print its timestamp 
     printjson(last_element.next()._id.getTimestamp()); 
    } 
}) 

आप शायद भी वहाँ में एक .hasNext() जांच संभव खाली संग्रह को पूरा करना चाहते हैं: तब आप अपने कोड लागू कर सकते हैं।

+0

मैं कहूंगा कि यह वास्तव में केवल शैल पर्यावरण में करने के लिए सुरक्षित है जहां सभी कॉल तुल्यकालिक हैं; एक असीमित ड्राइवर वातावरण में यह समाधान जोखिम भरा है (तेजी से उत्तराधिकार में कई समांतर प्रश्न)। – zamnuts

+0

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

+0

यह मेरे लिए काम नहीं करता है: 'अपरिभाषित' विधि 'को कॉल नहीं कर सकता ... ' mongo संस्करण 2.6.6 –

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