MongoDB Reference
2024. 1. 19. 11:07ㆍSpring Boot
외래키로 다른 table을 참조하는 RDMS처럼 NoSQL도 다른 collection를 참조 할 수 있고
이 방법은 Reference와 Embedded 두 가지로 나뉜다 그 중에서 Referencne를 구현해 보겠다
우선 부모 데이터가 참조할 자식 데이터를 만든다
import org.bson.types.ObjectId;
import org.springframework.data.mongodb.core.mapping.Document;
import jakarta.persistence.Id;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Document("child")
public class mongoChild {
@Id
private ObjectId id;
private String data;
public mongoChild(String data) {
this.data = data;
}
}
import org.bson.types.ObjectId;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.stereotype.Repository;
@Repository
public interface child_repository extends MongoRepository<mongoChild, ObjectId> {
}
그 후
@DBRef 붙여 참조할 자식 데이터라 알리고
참조할 자식 List를 만든다
import org.bson.types.ObjectId;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.DBRef;
import org.springframework.data.mongodb.core.mapping.Document;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.ArrayList;
import java.util.List;
@Document(collection = "test")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class test_db {
@Id
private ObjectId id;
private String title;
private String data;
@DBRef
List<mongoChild> childs;
public test_db(String title, String data) {
this.title = title;
this.data = data;
this.childs = new ArrayList<mongoChild>();
}
}
그후 기존 Service에 자식 데이터를 이용하는 메소드를 정의한다
public List<mongoChild> all_child(test_db parent) {
return parent.getChilds();
}
//기존 repository만 이용한 update child를 전부 읽고 수정 후 다 저장하느 방식이라 속도가 느리다
public void create_child(ObjectId parentId, String data) {
Optional<test_db> tmp = repository.findById(parentId);
if(tmp != null) {
test_db test = tmp.get();
mongoChild tmpC = new mongoChild(data);
repositoryC.save(tmpC);
List<mongoChild> tmpL = test.getChilds();
tmpL.add(tmpC);
test.setChilds(tmpL);
repository.save(test);
}
}
//query를 따로 지정하여 만든 update 속도가 빠르다
public void create_child2(ObjectId parentId, String data) {
Query query = Query.query(Criteria.where("_id").is(parentId));
mongoChild child = repositoryC.save(new mongoChild(data));
Update update = new Update().push("childs", child);
test_db update_test = mongoTemplate.findAndModify(query, update, test_db.class);
if(update_test == null) {
System.out.println("no test_db error");
}
}
'Spring Boot' 카테고리의 다른 글
| Oauth2 by Google (0) | 2024.01.22 |
|---|---|
| Docker Container에 JAR 이미지 돌리기 (0) | 2024.01.20 |
| Https (0) | 2024.01.12 |
| MySQL (0) | 2024.01.12 |
| Json Web Token (2) | 2024.01.02 |