MongoDb mongoTemplate для нескольких баз данныхJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 MongoDb mongoTemplate для нескольких баз данных

Сообщение Anonymous »

У меня есть 2 базы данных:
  • test: содержит коллекцию под названием people, содержащую документы, представляющие класс Person и Author.
  • test2: содержит коллекцию под названием somethingElse, содержащую документы, представляющие Класс SomethingElse
Моя проблема заключается в том, что при использовании автоматически подключаемого MongoTemplate я могу взаимодействовать только с коллекциями, хранящимися внутри test. При сохранении нового объекта SomethingElse коллекция создается и вставляется в базу данных test. Как я могу гарантировать, что документы класса SomethingElse извлекаются, сопоставляются и сохраняются только в базе данных test2 или из нее?
Ниже приведен код, показывающий, как генерируются и запрашиваются тестовые данные, а также классы, с которыми они сопоставляются.
MongoConfig.java
package com.example.demo;

import com.mongodb.client.MongoClient;
import com.mongodb.client.MongoClients;
import lombok.Getter;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.mongodb.config.AbstractMongoClientConfiguration;

@SpringBootApplication
public class MongoConfig extends AbstractMongoClientConfiguration {

@Getter
MongoClient client;
@Override
protected String getDatabaseName() {
return "test";
}

@Override
public MongoClient mongoClient() {

MongoClient client = MongoClients.create("mongodb://127.0.0.1:27017/test");

this.client = client;

return client;
}

}


TestData.java
package com.example.demo;

import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import org.bson.Document;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.UUID;

@Component
public class TestData {

@Autowired
MongoConfig config;

private static String FIRST_DB = "test";
private static String SECOND_DB = "test2";
private void insertFirstDatabase(){
MongoDatabase database = config.getClient().getDatabase(FIRST_DB);

MongoCollection collection = database.getCollection("people");

Document person = new Document().append("_id",UUID.randomUUID().toString())
.append("name","Larry").append("email","larry@gmail.com").append("_class","person");

Document author = new Document().append("_id",UUID.randomUUID().toString())
.append("name","Frank").append("email","frank@gmail.com").append("articleCount",1).append("active",true)
.append("_class","author");

collection.insertOne(person);
collection.insertOne(author);

}

private void insertSecondDatabase(){
Document somethingElseDocument = new Document().append("_id",UUID.randomUUID().toString())
.append("name","example document").append("_class","somethingElse");
config.getClient().getDatabase(SECOND_DB).getCollection("somethingElse").insertOne(somethingElseDocument);
}

public void insert(){
insertFirstDatabase();
insertSecondDatabase();
}

public void cleanUp() {
MongoDatabase firstDatabase = config.getClient().getDatabase(FIRST_DB);
firstDatabase.drop();
MongoDatabase secondDatabase = config.getClient().getDatabase(SECOND_DB);
secondDatabase.drop();

}
}


Test.java
package com.example.demo;

import jakarta.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.UUID;

@Component
public class Test {

@Autowired
TestData testData;
@Autowired
MongoTemplate mongoTemplate;

@PostConstruct
public void startTest(){
testData.insert();

List
allPeople = mongoTemplate.findAll(Person.class);
for (Person person : allPeople) {
System.out.println(person.toString());
}
List otherEntities = mongoTemplate.findAll(SomethingElse.class);
for (SomethingElse entity : otherEntities) {
System.out.println(entity.toString());
}

SomethingElse newEntity = new SomethingElse(UUID.randomUUID().toString(),"wrong database");
mongoTemplate.insert(newEntity);

//Breakpoint here to view DB
testData.cleanUp();

}
}


Person.java
package com.example.demo;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.TypeAlias;
import org.springframework.data.mongodb.core.mapping.Document;

@Document(collection = "people")
@TypeAlias("person")
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
public class Person {
@Id
private String id;

private String name;

private String email;

@Override
public String toString(){
return this.getName() + " (PERSON)";
}
}


Author.java
package com.example.demo;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import org.springframework.data.annotation.PersistenceCreator;
import org.springframework.data.annotation.TypeAlias;

@TypeAlias("author")
@AllArgsConstructor
@NoArgsConstructor
@Getter
@Setter
class Author extends Person{
private Integer articleCount;

private Boolean active;

@PersistenceCreator
public Author(String id, String name, String email, int articleCount, boolean active) {
super(id,name,email);
this.articleCount = articleCount;
this.active = active;
}

@Override
public String toString(){
return this.getName() + " (AUTHOR)";
}
}

pom.xml


4.0.0

org.springframework.boot
spring-boot-starter-parent
4.0.3


com.example
demo
0.0.1-SNAPSHOT
MongoDb Multiple DBs
Demo project for Spring Boot














17



org.springframework.boot
spring-boot-starter



org.springframework.boot
spring-boot-starter-test
test




org.springframework.boot
spring-boot-starter-data-mongodb
4.1.0-M2
compile




org.projectlombok
lombok
1.18.42
compile







org.springframework.boot
spring-boot-maven-plugin








Подробнее здесь: https://stackoverflow.com/questions/799 ... -databases
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»