728x90
MongoDB로 Join을 해보자
먼저, MongoDB의 경우 NoSQL로 Join을 지원하지 않는다.
그렇지만 MongoDB 3.2부터는 비슷한 기능인 $lookup 기능을 지원하고 있다.
db.getCollection('기준_컬렉션').aggregate([
{
$lookup:
{
from: "조인할 컬렉션",
localField: "기준 컬렉션 필드",
foreignField: "조인할 컬렉션의 필드",
as: "조인 된 데이터가 생성될 신규 필드명"
}
}
,{ $out : "신규로 생성 될 컬렉션명" }
])
위와 같이 쿼리를 입력하여 실행하면 Embedded document 형태로 생성 된다.
실행
[person]
/* 1 */
{
"_id" : ObjectId("61f25a65b8edc7891f89778c"),
"name" : "lee chang ho",
"age" : "33",
"team" : 1
}
/* 2 */
{
"_id" : ObjectId("61f25a80b8edc7891f897ac8"),
"name" : "kim chul su",
"age" : "30",
"team" : 1
}
/* 3 */
{
"_id" : ObjectId("61f25a8db8edc7891f897c3e"),
"name" : "sunja",
"age" : "23",
"team" : 2
}
[team]
/* 1 */
{
"_id" : ObjectId("61f25aa8b8edc7891f897f63"),
"name" : "search team",
"num" : 1
}
/* 2 */
{
"_id" : ObjectId("61f25ab0b8edc7891f898033"),
"name" : "data team",
"num" : 2
}
JOIN QUERY
db.getCollection('team').aggregate([
{
$lookup:
{
from: "person",
localField: "num",
foreignField: "team",
as: "join_field"
}
},
{
$match: {
"join_field": {$ne: []}
}
}
,{ $out : "view_test" }
])
결과
/* 1 */
{
"_id" : ObjectId("61f25aa8b8edc7891f897f63"),
"name" : "search team",
"num" : 1,
"join_field" : [
{
"_id" : ObjectId("61f25a65b8edc7891f89778c"),
"name" : "lee chang ho",
"age" : "33",
"team" : 1
},
{
"_id" : ObjectId("61f25a80b8edc7891f897ac8"),
"name" : "kim chul su",
"age" : "30",
"team" : 1
}
]
}
/* 2 */
{
"_id" : ObjectId("61f25ab0b8edc7891f898033"),
"name" : "data team",
"num" : 2,
"join_field" : [
{
"_id" : ObjectId("61f25a8db8edc7891f897c3e"),
"name" : "sunja",
"age" : "23",
"team" : 2
}
]
}
위와 같이 각 팀에 속한 사람들을 embeded 형태로 묶을 수 있게 되었다.
하지만 이 같은 방법은 건수가 적을때만 쓰시길 권장한다..
'MongoDB' 카테고리의 다른 글
Bson 이란? (0) | 2022.04.21 |
---|---|
MongoDB 정리 (0) | 2022.02.15 |
MongoDB 자주 쓰는 쿼리 (0) | 2022.01.26 |