2013-05-17 6 views
9

मैं अपने मोंगोडीबी संग्रहों में से एक के लिए स्कीमा बदलने की प्रक्रिया में हूं। (मैं तारों के रूप में तारीखों को संग्रहीत कर रहा था, और अब मेरा एप्लिकेशन उन्हें ISODate एस के रूप में संग्रहीत करता है; मुझे वापस जाने और ISODate एस का उपयोग करने के लिए सभी पुराने रिकॉर्ड बदलने की आवश्यकता है।) मुझे लगता है कि मुझे अपडेट का उपयोग करके यह कैसे करना है , लेकिन चूंकि यह ऑपरेशन हजारों रिकॉर्डों को प्रभावित करेगा, इसलिए मैं एक ऑपरेशन जारी करने में संकोच कर रहा हूं कि मैं 100% निश्चित नहीं हूं। क्या एक अद्यतन की "सूखी दौड़" करने का कोई तरीका है जो मुझे दिखाएगा, रिकॉर्ड की एक छोटी संख्या के लिए, मूल रिकॉर्ड और यह कैसे बदला जाएगा?क्या एक अद्यतन ऑपरेशन के "सूखे रन" को करने का कोई तरीका है?


संपादित करें: मैं प्रत्येक रिकॉर्ड करने के लिए एक नए क्षेत्र को जोड़ने, और फिर से दृष्टिकोण का उपयोग कर समाप्त हो गया मूल मिलान करने के लिए उस क्षेत्र का नाम बदलने (सत्यापित करें कि डेटा सही था के बाद)। यह इस तरह से देखा: वैसे

db.events.find({timestamp: {$type: 2}}) 
    .forEach(function (e) { 
     e.newTimestamp = new ISODate(e.timestamp); 
     db.events.save(e); 
    }) 

db.events.update({}, 
    {$rename: {'newTimestamp': 'timestamp'}}, 
    {multi: true}) 

, ISODate रों को स्ट्रिंग बार परिवर्तित करने के लिए है कि विधि क्या काम कर रहा समाप्त हो गया था। (मुझे this SO answer से विचार मिला।)

+1

मेरी सलाह आईएसओडीएटी को एक नए क्षेत्र के रूप में जोड़ना होगा। एक बार पुष्टि हुई कि सभी अच्छे दिखते हैं तो आप स्ट्रिंग तिथि को अनसेट कर सकते हैं। –

+0

@JamesWahlin का सही विचार है, यहां तक ​​कि एसक्यूएल में जो सूखे रनों का समर्थन करता है मैं यह नहीं करता – Sammaye

+0

@JamesWahlin क्या आप अपनी टिप्पणी को उत्तर के रूप में जोड़ सकते हैं? – bdesham

उत्तर

3

में मेरी सलाह आईएसओडीएटी को एक नए क्षेत्र के रूप में जोड़ना होगा। एक बार पुष्टि हुई कि सभी अच्छे दिखते हैं तो आप स्ट्रिंग तिथि को अनसेट कर सकते हैं।

4

अपनी डेटाबेस संरचना के साथ एक परीक्षण वातावरण बनाएं। इसमें कुछ हद तक रिकॉर्ड्स कॉपी करें। समस्या सुलझ गयी। वह समाधान नहीं जिसे आप ढूंढ रहे थे, मुझे यकीन है। लेकिन, मुझे विश्वास है, यह सटीक परिस्थितियों में है कि 'परीक्षण पर्यावरण' का उपयोग किया जाना चाहिए।

+0

मैंने इसके बारे में सोचा। लेकिन अगर मेरा पहला प्रयास काम नहीं करता है, तो मुझे विकास पर्यावरण को साफ़ करना होगा और डेटा को फिर से आयात करना होगा - संभावित रूप से कई बार - और यह एक परेशानी की तरह लग रहा था जिसे मैं टालने में सक्षम हो सकता हूं। – bdesham

+0

हाँ, मुझे लगता है कि माना गया था, बस सोचा था कि मैं वहाँ सुझाव फेंक दूंगा, वैसे भी ... कभी-कभी मैं कभी-कभी साधारण सामानों को अनदेखा करता हूं। – eidsonator

2

विशेष रिकॉर्ड की आईडी का चयन करें जिसे आप मॉनिटर करना चाहते हैं। update{_id:{$in:[<your monitored id>]}}

+0

यह एक दृष्टिकोण है, हालांकि अगर मैं अद्यतन ऑपरेशन को खराब करता हूं तो यह डेटा को नष्ट करने की संभावना को खुलता है। – bdesham

+2

@bdesham बैकअप के बिना लाइव डेटा के साथ प्रयोग करना बुरा अभ्यास है। यह किसी भी उत्पादन में हेरफेर के लिए अंगूठे-उंगली-नियम है - पहले रोलबैक बिंदु बनाएं – Dewfy

0

एक और विकल्प जो ओवरहेड की मात्रा पर निर्भर करता है, आपको यह कारण देगा - आप एक स्क्रिप्ट लिखने पर विचार कर सकते हैं, जो खोज ऑपरेशन करता है, प्रिंटआउट जोड़ता है या सहेजने के दौरान डीबग में चलाता है। एक बार जब आप आत्मविश्वास प्राप्त कर लेंगे तो आप सेव ऑपरेशन लागू कर सकते हैं।

var changesLog = []; 
var errorsLog = []; 
events.find({timestamp: {$type: 2}}, function (err, events) { 
    if (err) { 
     debugger; 
     throw err; 
    } else { 
     for (var i = 0; i < events.length; i++) { 
      console.log('events' + i +"/"+(candidates.length-1)); 
      var currentEvent = events[i]; 
      var shouldUpdateCandidateData = false; 

      currentEvent.timestamp = new ISODate(currentEvent.timestamp); 


      var change = currentEvent._id; 
      changesLog.push(change); 

      // // ** Dry Run ** 
      //  currentEvent.save(function (err) { 
      //   if (err) { 
      //    debugger; 
      //    errorsLog.push(currentEvent._id + ", " + currentEvent.timeStamp + ', ' + err); 
      //    throw err; 
      //   } 
      //  }); 
     } 
     console.log('Done'); 
     console.log('Changes:'); 
     console.log(changesLog); 
     console.log('Errors:'); 
     console.log(errorsLog); 
     return; 
    } 
}); 
संबंधित मुद्दे

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