ترحيل البيانات باستخدام mongoDB و Spring Boot

يواجه كل مطور عاجلاً أم آجلاً الحاجة إلى ترحيل البيانات في قاعدة بيانات. في مشروعنا ، نستخدم mongoDB كقاعدة بيانات. لقد تعاملنا مع ترحيل البيانات بطرق مختلفة:


  • كتب مخطوطات js وركض مباشرة في قاعدة البيانات
  • تستخدم Mongobee - أداة للهجرات التلقائي


    عملت Mongobee بشكل جيد حتى واجهنا موقفًا حيث أردنا إضافة حقل جديد بمؤشر فريد. دعنا نقول لدينا فئة:


    @Document @Data public class TestDocument { @Id private String id; private String text; } 

    نضيف الآن حقل جديد:


     @Document @Data public class TestDocument { @Id private String id; private String text; @Indexed(unique = true) private String text2; } 

    لقد كتبنا عملية ترحيل ، والتي يجب أن تملأ النص text2 في جميع المستندات بقيم فريدة:


     @ChangeLog public class TestDocumentChangelog { @ChangeSet(order = 1, id = "change1", author = "Stepan") public void changeset(MongoTemplate template) { template.findAll(Document.class, "testDocument").forEach(document -> { document.put("text2", UUID.randomUUID().toString()); template.save(document, "testDocument"); }); } } 

    ولكن عندما بدأنا التطبيق ، رأينا أن Spring أطلق مكونات Mongo Data قبل بدء الترحيل ، وبالتالي حدث خطأ أثناء إنشاء الفهرس تلقائيًا فوق حقل text2 ، حيث لم يتم ملء هذا الحقل بأي مستند.
    بعد هذا الحادث ، قررنا التخلي عن Mongobee ومحاولة كتابة الأداة الخاصة بنا ، والتي من شأنها أن تجعل من السهل أيضًا كتابة عمليات الترحيل ، ولكن بالإضافة إلى ذلك ، سيكون لها ميزات مثل:


  • تشغيل قبل بيانات Mongo
  • دعم المعاملات المضافة في MongoDB 4.0
  • حقن التبعية في فصول سجل التغيير

والنتيجة هي مكتبة تسمى Mongration ، والتي تدعم جميع الوظائف المذكورة أعلاه.


ربيع دورة حياة الدعم


يتم تنفيذ الوظيفة الأولى باستخدام التكوين التلقائي ، والذي يبدأ بعد إنشاء MongoClient وقبل مسح المستودعات:


 @Configuration @AutoConfigureAfter(MongoAutoConfiguration.class) @AutoConfigureBefore(MongoDataAutoConfiguration.class) @Import(MongrationConfiguration.class) public class MongrationAutoConfiguration { } 

ولكن المشكلة في التكوين التلقائي هي أنه إذا كنت تستخدم التعليق التوضيحي @EnableMongoRepositories لتنشيط المستودعات ، @EnableMongoRepositories تهيئة مكونات بيانات Mongo قبل التكوين التلقائي الخاص بنا. لتجنب هذه المشكلة ، يجب عليك استخدام التعليق التوضيحي @EnableMongoRepositories مع @EnableMongoRepositories :


 @Configuration @EnableMongoRepositories @EnableMongration public class MongoRepositoriesConfiguration { } 

لا يعمل @EnableMongration شيء سوى تشغيل التكوين نفسه ، ويسمح لك بتشغيله مسبقًا فقط:


 @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Import(MongrationConfiguration.class) public @interface EnableMongration { } 

دعم المعاملات


لدعم المعاملات ، يجب عليك تكوين مجموعة النسخ المتماثلة MongoDB. من الضروري أيضًا إعلان حبة MongoTransationManager (إذا لم يعثر Mongration على هذه الحبة في سياقها ، فسيخلقها بنفسه). يسمح لك Mongration باستخدام المعاملات بطريقتين:


  • باستخدام @Transactional
     @Transactional @ChangeSet(order = 1, id = "change1", author = "Stepan") public void changeset(MongoTemplate template) { template.findAll(Document.class, "testDocument").forEach(document -> { document.put("text2", UUID.randomUUID().toString()); template.save(document, "testDocument"); }); } 
  • باستخدام TransactionTemplate
     @ChangeSet(order = 1, id = "change1", author = "Stepan") public void migration(MongoTemplate template, TransactionTemplate txTemplate) { template.createCollection("entity"); txTemplate.execute(new TransactionCallbackWithoutResult() { @Override protected void doInTransactionWithoutResult(TransactionStatus status) { template.save(new Document("index", "1").append("text", "1"), "entity"); template.save(new Document("index", "2").append("text", "2"), "entity"); template.save(new Document("index", "3").append("text", "3"), "entity"); } }); } 


الطريقة الثانية مفيدة حيث تتيح لك استخدام كل من عمليات DDL التي لا يمكن إطلاقها في معاملة وعمليات DML التي يتم إطلاقها في معاملة في عملية ترحيل واحدة.


حقن التبعية في فصول سجل التغيير


هذه الوظيفة ممكنة نظرًا لحقيقة أن كل فئة من فئات ChangeLog نفسها عبارة عن فاصوليا عادية:


 @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Component public @interface ChangeLog { } 

تجدر الإشارة إلى أنه لا يمكنك حقن فاصوليا لها تبعيات على مكونات بيانات Mongo ، لأنه بحلول وقت اكتمال عمليات الترحيل ، لم تتم تهيئة بعد.


شفرة المصدر للمكتبة متوفرة على جيثب .

Source: https://habr.com/ru/post/ar451798/


All Articles