IT/MongoDB

MONGODB - find

KeepGooing 2020. 6. 13. 11:06
반응형

 

{
    "_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