Database/MongoDB

6. Mongoose Subdocument

양디 2016. 2. 15. 17:19



Subdocument?


데이터베이스를 사용하다 보면, 한 데이터 베이스에 다른 스키마의 내용이 들어가야할 때가 종종 생긴다.


예를 들어 학급에 대한 컬렉션을 작성한다고 예를 들어보자.


학급은 여러가지 정보들이 들어가겠지만, 학생들의 정보가 들어가야 하는 것은 당연한 일이다.


예를 들어 Class 컬렉션에, 학년, 반, 담임, 학생 이라는 정보가 들어간다고 할 때에


SQL 에서는 테이블을 아마 다음과 같이 짤 것이다.


Class 테이블 ( 학년 / 반 / 담임 )

Student 테이블 ( 반 / 학생 )


이런식으로 짜서, 두 테이블을 join하여 사용하지 않을까 싶다.


SQL의 조인 , 트랜잭션 등의 기능은 아주 강력하고 편리한 기능이다.


그러나 NoSQL에서는 그러한 기능이 없기 때문에 다른 방식을 사용하여야 하는데, 이것이 Subdocument 이다.


Document 안에 document를 집어 넣는 것이다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var teacherSchema = new Schema({
    name : String,
    age : Number,
    subject : String
});
var Teacher = mongoose.model('teachers', teacherSchema);
 
var studentSchema = new Schema({
    name : String,
    age : Number,
    id : Number // 번호
});
var Student = mongoose.model('students', studentSchema);
 
var classSchema = new Schema({
    grade = Number// 학년
    class = Number// 반
    teacher = teacherSchema, // 담임
    student = [studentSchema] // 학생들
});
var Class = mongoose.model('class', classSchema);
cs


위의 classSchema 스키마 보면 18, 19번 라인에 담임 스키마와 학생 스키마가 있는 것을 알 수 있다.


특히 19번 같은 경우는, 학생이 한두명이 아니기 때문에 여러 명을 넣을 수 있게 하기 위하여 리스트로 선언되어 있음을 알 수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
var newClass = new Class({
    grade : 1,
    class : 3,
    teacher : new Teacher({name:"달콤", age:"45", subject:"과학"}),
    student : [new Student({name:"학생1", age:17, id:1})]
});
 
newClass.student.push(new Student({name:"학생2", age:17, id:2}));
 
newClass.save(function(err){
    if(!err)
        console.log('saved');
})
cs


이런식으로 사용할 수 있다.


클래스 객체를 모델로 만들고, 선생 정보와 학생 정보를 집어넣어서 넣을 수 있다.


또한 push를 통해 집어넣을 수도 있다.


이런 식으로 mongodb 에 저장하고 나서 결과를 봐보면,


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
{
    "_id" : ObjectId("56c189ebe0c7665c1f9a7d3b"),
    "grade" : 1,
    "class" : 3,
    "teacher" : {
        "name" : "달콤",
        "age" : 45,
        "subject" : "과학",
        "_id" : ObjectId("56c189ebe0c7665c1f9a7d39")
    },
    "student" : [ 
        {
            "_id" : ObjectId("56c189ebe0c7665c1f9a7d3a"),
            "id" : 1,
            "age" : 17,
            "name" : "학생1"
        }, 
        {
            "_id" : ObjectId("56c189ebe0c7665c1f9a7d3c"),
            "id" : 2,
            "age" : 17,
            "name" : "학생2"
        }
    ],
    "__v" : 0
}

cs


이런 식으로 저장되어 있음을 알 수 있다.




댓글