반응형
{
"_id" : ObjectId("5edf2e8ec4130e33cda725b3"),
"intent" : "MBTI_TYPE",
"intentArray" : [
{
"type1" : "ISTJ",
"executeInfo" : [
{
"check" : "foodTendency",
"type2" : "female",
"type2Data" : [
{
"searchData" : {
"name" : "Jessica",
"height" : "165",
"weight" : "42"
},
"returnData" : "파인애플"
},
{
"searchData" : {
"name" : "Amy",
"height" : "165",
"weight" : "42"
},
"returnData" : "사과"
},
{
"searchData" : {
"name" : "Alice",
"height" : "165",
"weight" : "42"
},
"returnData" : "샌드위치"
}
]
},
{
"check" : "foodTendency",
"type2" : "male",
"type2Data" : [
{
"searchData" : {
"name" : "john",
"height" : "175",
"weight" : "72"
},
"returnData" : "파인애플"
},
{
"searchData" : {
"name" : "josh",
"height" : "190",
"weight" : "92"
},
"returnData" : "사과"
},
{
"searchData" : {
"name" : "kan",
"height" : "185",
"weight" : "82"
},
"returnData" : "샌드위치"
}
]
}
]
}
]
}
조회의 가장 기본이라고 할 수 있다.
각설하고 바로 알아보자
db.getCollection('intent_test').find({"intent" : "MBTI_TYPE"});
결과
{
"_id" : ObjectId("5edf2e8ec4130e33cda725b3"),
"intent" : "MBTI_TYPE",
"intentArray" : [
{
"type1" : "ISTJ",
"executeInfo" : [
{
"check" : "foodTendency",
"type2" : "female",
"type2Data" : [
{
"searchData" : {
"name" : "Jessica",
"height" : "165",
"weight" : "42"
},
"returnData" : "파인애플"
},
{
"searchData" : {
"name" : "Amy",
"height" : "165",
"weight" : "42"
},
"returnData" : "사과"
},
{
"searchData" : {
"name" : "Alice",
"height" : "165",
"weight" : "42"
},
"returnData" : "샌드위치"
}
]
},
{
"check" : "foodTendency",
"type2" : "male",
"type2Data" : [
{
"searchData" : {
"name" : "john",
"height" : "175",
"weight" : "72"
},
"returnData" : "파인애플"
},
{
"searchData" : {
"name" : "josh",
"height" : "190",
"weight" : "92"
},
"returnData" : "사과"
},
{
"searchData" : {
"name" : "kan",
"height" : "185",
"weight" : "82"
},
"returnData" : "샌드위치"
}
]
}
]
}
]
}
몽고디비 조회는 도큐먼트 단위이다.
RDB로 치면
콜렉션(intent_test) - 테이블
도큐먼트 - 테이블의 행
특정 필드의 값으로 조회하게 되면 특정 필드 값이 아닌 도큐먼트 전체 값이 조회된다.
$slice Operator
type2Data 배열의 0번째에서 1번째 값을 갖고오고 싶을 때 다음과 같이 쓴다.
db.getCollection('intent_test').find({"intent":"MBTI_TYPE"}, {"intentArray.executeInfo.type2Data":{$slice:[0,1]}})
결과
/* 1 */
{
"_id" : ObjectId("5edf2e8ec4130e33cda725b3"),
"intent" : "MBTI_TYPE",
"intentArray" : [
{
"type1" : "ISTJ",
"executeInfo" : [
{
"check" : "foodTendency",
"type2" : "female",
"type2Data" : [
{
"searchData" : {
"name" : "Jessica",
"height" : "165",
"weight" : "42"
},
"returnData" : "파인애플"
}
]
},
{
"check" : "foodTendency",
"type2" : "male",
"type2Data" : [
{
"searchData" : {
"name" : "john",
"height" : "175",
"weight" : "72"
},
"returnData" : "파인애플"
}
]
}
]
}
]
}
근데 여기에서 type2의 female만 갖고오고 싶은데 male도 나왔다.
앞서 말한데로 도큐먼트 단위로 나오기 때문에 필드로 하나의 다큐먼트를 여러개 나눠 조건 값을 부여 해야한다.
이떄는 보통 aggregation 함수를 많이 쓰는데 추후에 게시하겠다.
$elemMatch operator
intentArray에서 type1 필드 값이 ISTJ인 경우 인 것만 조회
db.getCollection('intent_test').find({intent:"MBTI_TYPE"}, {"intentArray" :{$elemMatch:{"type1" : "ISTJ"}}});
결과
/* 1 */
{
"_id" : ObjectId("5edf2e8ec4130e33cda725b3"),
"intentArray" : [
{
"type1" : "ISTJ",
"executeInfo" : [
{
"check" : "foodTendency",
"type2" : "female",
"type2Data" : [
{
"searchData" : {
"name" : "Jessica",
"height" : "165",
"weight" : "42"
},
"returnData" : "파인애플"
},
{
"searchData" : {
"name" : "Amy",
"height" : "165",
"weight" : "42"
},
"returnData" : "사과"
},
{
"searchData" : {
"name" : "Alice",
"height" : "165",
"weight" : "42"
},
"returnData" : "샌드위치"
}
]
},
{
"check" : "foodTendency",
"type2" : "male",
"type2Data" : [
{
"searchData" : {
"name" : "john",
"height" : "175",
"weight" : "72"
},
"returnData" : "파인애플"
},
{
"searchData" : {
"name" : "josh",
"height" : "190",
"weight" : "92"
},
"returnData" : "사과"
},
{
"searchData" : {
"name" : "kan",
"height" : "185",
"weight" : "82"
},
"returnData" : "샌드위치"
}
]
}
]
}
]
}
사실 현재는 도큐먼트가 하나인 뿐이라 의미가 없다.
하지만 유형이 늘어나고 도큐먼트가 그만큼 늘어난다면 효율적으로 데이터 조회가 된다.
이외 find 함수의 관련 연산자가 많다.
하지만 조회할 때는 특정한 필드 값만 뽑기 원하거나 혹은 가공처리하여 조회하기 원할 때가 있다.
이때 아주 효과적으로 활용할 수 있는 aggregation이라는 함수가 있다.
이것만 잘 알아둬도 웬만한 조회 서비스는 구현할 수 있다.
다음은 aggregation의 다양한 사례를 알아보자.
반응형
'IT > MongoDB' 카테고리의 다른 글
몽고디비 - findOneAndUpdate (0) | 2020.06.13 |
---|---|
MONGODB - aggregate (0) | 2020.06.13 |
MONGODB - 기본구조 (0) | 2020.06.09 |
몽고DB 집계 함수 (0) | 2019.07.30 |
클라우드/빅데이터 (0) | 2019.07.27 |