MongoDB рдФрд░ рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдХреЗ рд╕рд╛рде рдбреЗрдЯрд╛ рдорд╛рдЗрдЧреНрд░реЗрд╢рди

рд╣рд░ рдбреЗрд╡рд▓рдкрд░ рдЬрд▓реНрдж рдпрд╛ рдмрд╛рдж рдореЗрдВ рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдбреЗрдЯрд╛ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░, рд╣рдо рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ mongoDB рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд╣рдордиреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд░реАрдХреЛрдВ рд╕реЗ рдбреЗрдЯрд╛ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдХрд┐рдпрд╛:


  • js рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦреА рдФрд░ рд╕реАрдзреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛
  • рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ 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; } 

    рд╣рдордиреЗ рдПрдХ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рд▓рд┐рдЦрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдореЗрдВ рдЯреЗрдХреНрд╕реНрдЯ 2 рдлрд╝реАрд▓реНрдб рдХреЛ рдЕрджреНрд╡рд┐рддреАрдп рдорд╛рдиреЛрдВ рдХреЗ рд╕рд╛рде рднрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:


     @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"); }); } } 

    рд▓реЗрдХрд┐рди рдЬрдм рд╣рдордиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╢реБрд░реВ рдХрд┐рдпрд╛, рддреЛ рд╣рдордиреЗ рджреЗрдЦрд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рдкреНрд░рд╡рд╛рд╕ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рдиреЗ рдореИрдВрдЧреЛ рдбреЗрдЯрд╛ рдШрдЯрдХреЛрдВ рдХреЛ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдерд╛, рдФрд░ рдЗрд╕рд▓рд┐рдП рдЯреЗрдХреНрд╕реНрдЯ 2 рдлрд╝реАрд▓реНрдб рдХреЗ рдКрдкрд░ рдЗрдВрдбреЗрдХреНрд╕ рдмрдирд╛рддреЗ рд╕рдордп рдПрдХ рддреНрд░реБрдЯрд┐ рд╣реБрдИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдлрд╝реАрд▓реНрдб рдЕрднреА рддрдХ рдХрд┐рд╕реА рднреА рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВ рднрд░реА рдЧрдИ рд╣реИред
    рдЗрд╕ рдШрдЯрдирд╛ рдХреЗ рдмрд╛рдж, рд╣рдордиреЗ рдореЛрдВрдЧреЛрдмреА рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдФрд░ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЯреВрд▓ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рдЬрд┐рд╕рд╕реЗ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рд▓рд┐рдЦрдирд╛ рднреА рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рднреА рд╣реЛрдВрдЧреА:


  • рдорд╛рдирдЧреЛ рдбреЗрдЯрд╛ рд╕реЗ рдкрд╣рд▓реЗ рдЪрд▓рд╛рдПрдБ
  • MongoDB 4.0 рдореЗрдВ рд▓реЗрдирджреЗрди рд╕рдорд░реНрдерди рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛
  • ChangeLog рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди

рдкрд░рд┐рдгрд╛рдо рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ рдЬрд┐рд╕реЗ рдореЛрдВрдЧреЗрд╢рди рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╕рднреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред


рд╕реНрдкреНрд░рд┐рдВрдЧ рдмреВрдЯ рдЬреАрд╡рдирдЪрдХреНрд░ рд╕рдорд░реНрдерди


рдкрд╣рд▓рд╛ рдлрд╝рдВрдХреНрд╢рди рдСрдЯреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ MongoClient рдмрдирд╛рдиреЗ рдФрд░ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рд╕реНрдХреИрди рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ:


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

рд▓реЗрдХрд┐рди рдСрдЯреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП @EnableMongoRepositories рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдорд╛рд░реЗ рдСрдЯреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реЗ рдкрд╣рд▓реЗ Mongo рдбреЗрдЯрд╛ рдШрдЯрдХреЛрдВ рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ @EnableMongration рд╕рд╛рде @EnableMongration рдПрдиреЛрдЯреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:


 @Configuration @EnableMongoRepositories @EnableMongration public class MongoRepositoriesConfiguration { } 

@EnableMongration рд╕рдорд╛рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рд╕реЗ рдЕрдзрд┐рдХ рдХреБрдЫ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рдЖрдкрдХреЛ рдЗрд╕реЗ рдкрд╣рд▓реЗ рдЪрд▓рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:


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

рд▓реЗрди-рджреЗрди рдХрд╛ рд╕рдорд░реНрдерди


рд▓реЗрдирджреЗрди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкреНрд░рддрд┐рдХреГрддрд┐ рд╕реЗрдЯ MongoDB рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ MongoTransationManager рдмреАрди рдХреЛ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП (рдпрджрд┐ рдореЛрдВрдЯреЗрд╢рди рдЗрд╕ рдмреАрди рдХреЛ рд╕рдВрджрд░реНрдн рдореЗрдВ рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдмрдирд╛ рджреЗрдЧрд╛)ред рдкрд░рд┐рд╢реЛрдзрди рдЖрдкрдХреЛ рджреЛ рддрд░реАрдХреЛрдВ рд╕реЗ рд▓реЗрдирджреЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:


  • рдХрд╛ @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"); } }); } 


рджреВрд╕рд░реА рд╡рд┐рдзрд┐ рдЗрд╕ рдорд╛рдпрдиреЗ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реИ рдХрд┐ рдпрд╣ рдбреАрдбреАрдПрд▓ рдкрд░рд┐рдЪрд╛рд▓рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдПрдХ рд▓реЗрдирджреЗрди рдореЗрдВ рд▓реЙрдиреНрдЪ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдПрдХ рд╣реА рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдореЗрдВ рдПрдХ рд▓реЗрдирджреЗрди рдореЗрдВ рд▓реЙрдиреНрдЪ рдХрд┐рдП рдЧрдП рдбреАрдПрдордПрд▓ рд╕рдВрдЪрд╛рд▓рдиред


ChangeLog рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди


рдпрд╣ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╕рдВрднрд╡ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдЪреЗрдВрдЬрд▓реЙрдЧ рдХреНрд▓рд╛рд╕ рд╕реНрд╡рдпрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдмреАрди рд╣реИ:


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

рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдЖрдк рдЙрди рдмреАрдЬреЛрдВ рдХреЛ рдЗрдВрдЬреЗрдХреНрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдореИрдВрдЧреЛ рдбреЗрдЯрд╛ рдШрдЯрдХреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЬрдм рддрдХ рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдкреВрд░рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рддрдм рддрдХ рд╡реЗ рдЕрднреА рддрдХ рдЖрд░рдВрднреАрдХреГрдд рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред


рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб Github рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИред

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


All Articles