MongoDB Reference

2024. 1. 19. 11:07Spring 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