본문 바로가기
쿤즈 Server/MongoDB

[MongoDB] 검색(2): Array 또는 Object 검색 방법

by :)Koon 2021. 4. 14.

앞선 포스팅에서 MongoDB의 Document를 찾는 방법을 알아보았습니다.

2021.03.13 - [쿤즈 Server/MongoDB] - [MongoDB] Atlas 명령어 연결 및 find() 검색기능 사용방법

 

[MongoDB] Atlas 명령어 연결 및 find() 검색기능 사용방법

MongoDB가 무엇인지부터 MongoDB에서 사용하는 JSON과 BSON에 대해서도 차근차근 알아봤습니다. 기존에 많이 알려진 관계형 데이터베이스(RDBMS)가 아닌 NoSQL을 이용해서 데이터를 저장하는 방법을 채택

koonsland.tistory.com

 

find() 함수를 이용해서 데이터를 검색하다보면 의문점이 하나 발생합니다. 바로 Arrays 또는 Object형태의 데이터를 검색할 때에는 검색이 생각대로 안된다는 것입니다.

이번 포스팅에서는 배열로 저장된 데이터 또는 Object 형태로 저장된 데이터를 검색하는 방법에 대해서 알아보도록 하겠습니다.


Arrays 형태의 데이터 검색

MongoDB에서는 검색을 하면 JSON 형태의 데이터로 화면에 결과를 볼 수 있습니다. 이 중에서 Arrays 형태의 데이터가 존재하는 경우가 발생합니다. 다음과 같은 경우입니다.

저는 grades 라는 collections을 검색해 보았습니다. scores라는 키에 해당하는 값이 배열(Arrays)의 형태로 저장되어 있는 것을 확인하실 수 있습니다. 

 

만약 scores에서 type이 quiz인 student_id를 가져오고 싶을 땐 어떻게 해야 할까요?

이때 사용해야하는 쿼리는 $elemMatch입니다. 다음과 같이 사용할 수 있습니다.

db.grades.find({"scores":{"$elemMatch":{"type":"quiz"}}}).pretty()

배열 데이터를 가지고 있는 value 자리에 $elemMatch 키워드를 사용해서 quiz가 있는 데이터를 가져오도록 한 쿼리입니다. 찾고자 하는 배열 키를 넣고 해당하는 값에 $elemMatch를 입력해서 뒤에 찾고자 하는 데이터를 입력해서 검색할 수 있습니다.


비교 값 가져오기

만약 위 documents에서 scores의 type이 quiz이고 score의 값이 90 이상인 데이터만 가져오고 싶다면 어떻게 해야 할까요? 여기서 필요한 쿼리가 바로 대소 비교를 해주는 쿼리입니다. 쿼리에 넣어줄 키워드는 아래와 같습니다.

  • $gt : 비교하는 값보다 더 큰 값을 가져옴 (i.e. >)
  • $gte : 비교하는 값보다 크거나 같은 값을 가져옴 (i.e. >=)
  • $lt : 비교하는 값보다 작은 값을 가져옴 (i.e. <)
  • $lte : 비교하는 값돠 작거나 같은 값을 가져옴 (i.e. <=)

쿼리를 만들어 보겠습니다. 위 질문처럼 $elemMatch를 이용해서 quiz의 값들을 모두 가져오면서 type은 quiz이고 score의 값이 90 이상인 데이터를 가져오면 다음과 같습니다.

db.grades.find({
	"scores":{
		"$elemMatch":{
			"type":"quiz", 
			"score":{
				"$gte":90
			}
		}
	}
}).pretty()

앞선 쿼리와 동일하지만 추가적으로 score의 값이 90 이상인 데이터를 검색하도록 조건을추가했습니다. 검색 이후 비교를 하지 않아도 조건만 넣어주면 조건에 맞는 결과를 크기 비교를 통해서 가져옵니다. RDBMS의 SQL 쿼리와는 사용법이 달라 익숙하지 않지만 JSON 형태와 Javascript 문법을 사용하기 때문에 쉽게 이해할 수 있습니다.


Object 형태의 데이터 검색

Arrays와 달리 Object 형태의 데이터는 검색 방법이 다릅니다. 처음엔 저도 검색하는 방법을 몰라서 오랜 시간 찾아보며 다양항 방법을 시도해봤던것 같습니다. MongoDB에서 Object의 검색은 의외로 간단합니다.

다음과 같은 데이터를 보겠습니다. 저는 주소중 빌딩번호가 8825번을 검색하려고 합니다. 그래서 처음에는 아래와 같이 검색해보았습니다.

db.restaurants.find({"address":{"building":"8825"}}).pretty()

찾고자 하는 형태는 맞지만 이와 같은 방법으로는 검색이 되지 않습니다. 그래서 mongoDB Documents 문서를 검색한 결과 아래와 같이 사용해야 한다고 합니다.

db.restaurants.find({"address.building":"8825"}).pretty()

점(.)을 사용합니다. Object를 검색하기 위해서는 찾고자 하는 key들을 모두 점(.)으로 연결해서 키 조합을 만들어 냅니다. 오히려 이렇게 검색하는 것이 훨씬 간단하네요. 


이번 포스팅에서는 MongoDB에서 검색하는 방법에 대해서 추가적으로 알아보았습니다. 아직 새로운 것들이 많이 있어서 배워 나가는 단계라 익숙하지 않지만 또 이렇게 사용하다 보면 금방 익숙해질 것 같습니다. 도움이 되셨으면 합니다. 이상입니다.

댓글