본문 바로가기

MongoDB

MongoDB query 이해하기

Document에 저장된 객체의 하위객체 찾기

 

 

var mydoc = {
_id: objectId("5099803df3f4948bd2f98391"),
name:{first:"Alan", last:"Turing"},
birth: new Date('Jun 23,1912'),
death: new Date('Jun 07, 1954'),
contribs: ["Turing machine", "Turing test", "Turingery"],
views: numberLong(1250000)
}


//옳은 문법
//db.user.find({name:{first:"Alan"}})

//틀린 문법
//db.user.find({"name.first":"Alan"}})

 

위와 같은 document 값이 존재한다고 할 시,

"Alan"값을 찾을때 아래와 같이 찾을시 오류가 난다.

 

 

 

다음은 점표기를 통해 원하는 값을 찾아오는 예제이다.

 

//기본데이터
> db.inventory.find().pretty()
{
        "_id" : ObjectId("5dc3a2b5a16174ed6a4c3d2d"),
        "code" : "123",
        "tags" : {
                "hello" : "world",
                "fruits" : "apple"
        }
}

//원하는 값을 정확히 찾아옴
> db.inventory.find({"tags.hello":"world"}).pretty()
{
        "_id" : ObjectId("5dc3a2b5a16174ed6a4c3d2d"),
        "code" : "123",
        "tags" : {
                "hello" : "world",
                "fruits" : "apple"
        }
}

//쿼리가 잘못되진 않았지만 아무것도 찾아올 수 없음
> db.inventory.find({"tags":{hello:"world"}}).pretty()
>
>

 

 

추가적으로 배열이나, 여러가지 값을 가져오고 싶을때는 아래처럼 사용하면 된다.

 

 

 


논리연산자와 비교연산자

 

 

논리연산자

 

비교연산자

 

연산자 사용시 $를 누락하면 오류가 발생하게 된다.

 

 

기본적인 예시코드이다.

//논리연산자 예시
> db.number.find().pretty()
{ "_id" : ObjectId("5dc3c1b6a16174ed6a4c3d2e"), "num" : 10 }
{ "_id" : ObjectId("5dc3c1b6a16174ed6a4c3d2f"), "num" : 42 }
{ "_id" : ObjectId("5dc3c1b6a16174ed6a4c3d30"), "num" : 200 }
{ "_id" : ObjectId("5dc3c1b6a16174ed6a4c3d31"), "num" : 123 }
{ "_id" : ObjectId("5dc3c1b6a16174ed6a4c3d32"), "num" : 23 }
{ "_id" : ObjectId("5dc3c1b6a16174ed6a4c3d33"), "num" : 32 }
{ "_id" : ObjectId("5dc3c1b6a16174ed6a4c3d34"), "num" : 26 }

//23보다 같거나 큰
> db.number.find({num:{$gte:23}})
{ "_id" : ObjectId("5dc3c1b6a16174ed6a4c3d2f"), "num" : 42 }
{ "_id" : ObjectId("5dc3c1b6a16174ed6a4c3d30"), "num" : 200 }
{ "_id" : ObjectId("5dc3c1b6a16174ed6a4c3d31"), "num" : 123 }
{ "_id" : ObjectId("5dc3c1b6a16174ed6a4c3d32"), "num" : 23 }
{ "_id" : ObjectId("5dc3c1b6a16174ed6a4c3d33"), "num" : 32 }
{ "_id" : ObjectId("5dc3c1b6a16174ed6a4c3d34"), "num" : 26 }

//23보다 크거나 같고, 100보다 작은
> db.number.find({num:{$gte:23, $lt:100}})
{ "_id" : ObjectId("5dc3c1b6a16174ed6a4c3d2f"), "num" : 42 }
{ "_id" : ObjectId("5dc3c1b6a16174ed6a4c3d32"), "num" : 23 }
{ "_id" : ObjectId("5dc3c1b6a16174ed6a4c3d33"), "num" : 32 }
{ "_id" : ObjectId("5dc3c1b6a16174ed6a4c3d34"), "num" : 26 }

//23이나26이나100을 포함(배열)
> db.number.find({num:{$in:[23,26,100]}})
{ "_id" : ObjectId("5dc3c1b6a16174ed6a4c3d32"), "num" : 23 }
{ "_id" : ObjectId("5dc3c1b6a16174ed6a4c3d34"), "num" : 26 }

//23이나26,100을 미포함
> db.number.find({num:{$nin:[23,26,100]}})
{ "_id" : ObjectId("5dc3c1b6a16174ed6a4c3d2e"), "num" : 10 }
{ "_id" : ObjectId("5dc3c1b6a16174ed6a4c3d2f"), "num" : 42 }
{ "_id" : ObjectId("5dc3c1b6a16174ed6a4c3d30"), "num" : 200 }
{ "_id" : ObjectId("5dc3c1b6a16174ed6a4c3d31"), "num" : 123 }
{ "_id" : ObjectId("5dc3c1b6a16174ed6a4c3d33"), "num" : 32 }
>


//or 예시
//23이나, 26하나라도
> db.number.find({$or:[{num:23},{num:26}]})
{ "_id" : ObjectId("5dc3c1b6a16174ed6a4c3d32"), "num" : 23 }
{ "_id" : ObjectId("5dc3c1b6a16174ed6a4c3d34"), "num" : 26 }

//23포함하거나 id값이 해당 id일경우
> db.number.find({$or:[{num:23},{_id:ObjectId("5dc3c1b6a16174ed6a4c3d33")}]})
{ "_id" : ObjectId("5dc3c1b6a16174ed6a4c3d32"), "num" : 23 }
{ "_id" : ObjectId("5dc3c1b6a16174ed6a4c3d33"), "num" : 32 }
>

//not 예시 
//10이 아닌
> db.number.find({num:{$not:{$lte:10}}})
{ "_id" : ObjectId("5dc3c1b6a16174ed6a4c3d2f"), "num" : 42 }
{ "_id" : ObjectId("5dc3c1b6a16174ed6a4c3d30"), "num" : 200 }
{ "_id" : ObjectId("5dc3c1b6a16174ed6a4c3d31"), "num" : 123 }
{ "_id" : ObjectId("5dc3c1b6a16174ed6a4c3d32"), "num" : 23 }
{ "_id" : ObjectId("5dc3c1b6a16174ed6a4c3d33"), "num" : 32 }
{ "_id" : ObjectId("5dc3c1b6a16174ed6a4c3d34"), "num" : 26 }

//20이 아닌
> db.number.find({num:{$not:{$lte:20}}})
{ "_id" : ObjectId("5dc3c1b6a16174ed6a4c3d2f"), "num" : 42 }
{ "_id" : ObjectId("5dc3c1b6a16174ed6a4c3d30"), "num" : 200 }
{ "_id" : ObjectId("5dc3c1b6a16174ed6a4c3d31"), "num" : 123 }
{ "_id" : ObjectId("5dc3c1b6a16174ed6a4c3d32"), "num" : 23 }
{ "_id" : ObjectId("5dc3c1b6a16174ed6a4c3d33"), "num" : 32 }
{ "_id" : ObjectId("5dc3c1b6a16174ed6a4c3d34"), "num" : 26 }
>

 


Evaluation연산자

 

 

위에 설명한 연산자 외에도 특정 조건을 찾는 Evaluation연산자가 있으며,

그중에서도 정규표현식에 맞는 $regex연산자, 문자열 검색기능을 가진 $text연사자를 주로 사용한다.

 

 




 

기본적인 Text연산자 검색코드이다.

//Text연산자 한단어 검색시
> db.articles.find( { $text: { $search: "searchText" } } )

//Text연산자 여러단어 검색시(띄어쓰기)
> db.articles.find( { $text: { $search: "searchText1 searchText2 searchText3" } } )

//Text연산자 띄어쓰기를 포함한 구절을 검색
> db.articles.find( { $text: { $search: "\"search Text\"" }

text연산자의 search기능을 사용하려면 Index를 생성한 데이터에 한해 사용이 가능하다.

인덱스는 collection에 생성하며, index를 설정하면 field의 value값을 가지고

document들을 가리키는 포인터 값으로 이뤄진 B-Tree를 만든다.


인덱스를 생성한 field는 더 빠른 쿼리를 수행할 수 있다.

//인덱스생성
db.stores.createIndex({name:"text", description:"text"})

 


 

배열연산자

 

 

★배열 연산자


$all 연산자(쿼리값을 만족하는 모든 값찾기)
{ : { $all: [  ,  ... ] } }

 

> db.articles.find( { tags: { $all: ["school", "book"] } } ) 



{ : { $all: [  ,  ... ] } }  = { $and: [{: } ,{: } ... ] } 
배열 속 모든 값을 포함하는 Document를 찾는다 = A이고 B인 값을 포함하는 Document를 찾는다 

 

{ field: { $in: [, , ... ] } }  = { $or: [{: } ,{: } ... ] }
배열 속 어떤 값을 포함하는 Document를 찾는다 = A또는 B인 값을 포함하는 Document를 찾는다 

 

 


$elemMatch연산자(쿼리값을 만족하는 '배열' 값찾기)
해당 field가 query들을 만족하는 값을 갖는 '배열'Document를 선택

{ : { $elemMatch: { , , ... } } }

db.scores.find( { results: { $elemMatch: { $gte: 80, $lte: 85 } } } ) 


elemMatch로 매칭되는 모든 값들이 하나라도 query를 만족해야한다.
elemMatch연산자는 배열만 검색이 가능하다.
모든 값을 검색하려면 elemMatch를 지우고 find+조건문만으로 검색


$size 연산자(쿼리값을 만족하는 길이를 가진 배열찾기)
해당 field가 모든 query들을 만족하는 값을 갖는 Document를 선택

 

{ : { $size:  } }

db.scores.find( { results: {$size: 3} } )