04-29 02:46
Notice
Recent Posts
Recent Comments
관리 메뉴

Scientific Computing & Data Science

[MongoDB] Query / find 본문

Data Science/MongoDB

[MongoDB] Query / find

cinema4dr12 2014. 2. 1. 12:58

by Geol Choi | 

find 쿼리는 지금까지 다룬 내용에서 숱하게 많이 사용된 쿼리이다.

가장 기본적인 쿼리 중 하나로서 검색 조건에 대해 좀 더 알아보도록 하겠다.

우선 다음과 같이 데이터를 준비하자.

> db.customers.drop()
> db.customers.insert({name: "gchoi", age: 37, birthday: "08/22", email: "cinema4dr12@gmail.com"})
> db.customers.insert({name: "jmpark", age: 25, birthday: "04/02", email: "raspberry@gmail.com"})
> db.customers.insert({name: "tjkwak", age: 32, birthday: "11/11", email: "ozerodie@gmail.com"})
> db.customers.insert({name: "hskim", age: 36, birthday: "12/08", email: "codeblender@gmail.com"})
> db.customers.insert({name: "jhlee", age: 34, birthday: "07/12", email: "ijabul@gmail.com"})
> db.customers.insert({name: "dwseo", age: 33, birthday: "05/05", email: "cram@gmail.com"})


1. "include" 검색

만약 위와 같이 준비된 데이터 중 "name"과 "age"만을 검색 결과로 표시하고자 할 경우에는 각 해당 key값을 "1"로 입력한다. 즉,

> db.customers.find({},{name: 1, age: 1})
{ "_id" : ObjectId("52ec746ef97299c19188c2d0"), "name" : "gchoi", "age" : 37 }
{ "_id" : ObjectId("52ec746ef97299c19188c2d1"), "name" : "jmpark", "age" : 25 }
{ "_id" : ObjectId("52ec746ef97299c19188c2d2"), "name" : "tjkwak", "age" : 32 }
{ "_id" : ObjectId("52ec746ef97299c19188c2d3"), "name" : "hskim", "age" : 36 }
{ "_id" : ObjectId("52ec746ef97299c19188c2d4"), "name" : "jhlee", "age" : 34 }
{ "_id" : ObjectId("52ec746ff97299c19188c2d5"), "name" : "dwseo", "age" : 33 }

위의 검색결과를 보면 "name"과 "age"만으로 검색 결과를 얻을 수 있음을 확인할 수 있다.


2. "exclude" 검색

"include" 검색과 반대로 어떤 key에 대해 제외하는 경우는 key값을 "0"로 입력하면 된다. 즉,

> db.customers.find({},{email: 0, age: 0})
{ "_id" : ObjectId("52ec746ef97299c19188c2d0"), "name" : "gchoi", "birthday" : "08/22" }
{ "_id" : ObjectId("52ec746ef97299c19188c2d1"), "name" : "jmpark", "birthday" : "04/02" }
{ "_id" : ObjectId("52ec746ef97299c19188c2d2"), "name" : "tjkwak", "birthday" : "11/11" }
{ "_id" : ObjectId("52ec746ef97299c19188c2d3"), "name" : "hskim", "birthday" : "12/08" }
{ "_id" : ObjectId("52ec746ef97299c19188c2d4"), "name" : "jhlee", "birthday" : "07/12" }
{ "_id" : ObjectId("52ec746ff97299c19188c2d5"), "name" : "dwseo", "birthday" : "05/05" }

"email"과 "age"가 검색 결과에서 제외되었음을 확인할 수 있을 것이다.


3. 쿼리 조건(Query Conditionals)

가장 일반적으로 많이 사용되는 쿼리 조건에는 "$lt", "$lte", "$gt", "$gte" 등이 있다. 각각은 부등호 "<", "<=", ">", ">="와 대응된다. 예를 들어 앞서 준비된 고객(customers) 데이터 중 나이(age)가 33 이상인 고객을 추출한다고 가정해 보자.

> db.customers.find({"age" : {"$gte" : 33}})
{ "_id" : ObjectId("52ec746ef97299c19188c2d0"), "name" : "gchoi", "age" : 37, "birthday" : "08/22", "email" : "cinema4dr12@gmail.com" }
{ "_id" : ObjectId("52ec746ef97299c19188c2d3"), "name" : "hskim", "age" : 36, "birthday" : "12/08", "email" : "codeblender@gmail.com" }
{ "_id" : ObjectId("52ec746ef97299c19188c2d4"), "name" : "jhlee", "age" : 34, "birthday" : "07/12", "email" : "ijabul@gmail.com" }
{ "_id" : ObjectId("52ec746ff97299c19188c2d5"), "name" : "dwseo", "age" : 33, "birthday" : "05/05", "email" : "cram@gmail.com" }

만약 나이가 33이상 36이하의 고객을 검색하고자 한다면 다음과 같이 "$lte" 키를 입력한다.

> db.customers.find({"age" : {"$gte" : 33, "$lte": 36}})
{ "_id" : ObjectId("52ec746ef97299c19188c2d3"), "name" : "hskim", "age" : 36, "birthday" : "12/08", "email" : "codeblender@gmail.com" }
{ "_id" : ObjectId("52ec746ef97299c19188c2d4"), "name" : "jhlee", "age" : 34, "birthday" : "07/12", "email" : "ijabul@gmail.com" }
{ "_id" : ObjectId("52ec746ff97299c19188c2d5"), "name" : "dwseo", "age" : 33, "birthday" : "05/05", "email" : "cram@gmail.com" }

어떤 조건과 일치하지 않는 그 외 검색 결과를 얻고한다면 "$ne" 키를 입력한다. "name"에서 "gchoi"가 아닌 검색 결과를 얻어 보자.

> db.customers.find({name : {"$ne": "gchoi"}})
{ "_id" : ObjectId("52ec746ef97299c19188c2d1"), "name" : "jmpark", "age" : 25, "birthday" : "04/02", "email" : "raspberry@gmail.com" }
{ "_id" : ObjectId("52ec746ef97299c19188c2d2"), "name" : "tjkwak", "age" : 32, "birthday" : "11/11", "email" : "ozerodie@gmail.com" }
{ "_id" : ObjectId("52ec746ef97299c19188c2d3"), "name" : "hskim", "age" : 36, "birthday" : "12/08", "email" : "codeblender@gmail.com" }
{ "_id" : ObjectId("52ec746ef97299c19188c2d4"), "name" : "jhlee", "age" : 34, "birthday" : "07/12", "email" : "ijabul@gmail.com" }
{ "_id" : ObjectId("52ec746ff97299c19188c2d5"), "name" : "dwseo", "age" : 33, "birthday" : "05/05", "email" : "cram@gmail.com" }

"$in"은 특정 조건이 포함된 도큐먼트들을 검색한다. 검색 조건은 반드시 array 형태로 입력되어야 하며 array 엘리먼트 수는 1개 이상이어야 한다. 예를 들어 "name"이 "gchoi"와 "jmpark"을 포함하고 있는 도큐먼트들을 검색해 보자.

> db.customers.find({name : {"$in": ["gchoi", "jmpark"]}})
{ "_id" : ObjectId("52ec746ef97299c19188c2d0"), "name" : "gchoi", "age" : 37, "birthday" : "08/22", "email" : "cinema4dr12@gmail.com" }
{ "_id" : ObjectId("52ec746ef97299c19188c2d1"), "name" : "jmpark", "age" : 25, "birthday" : "04/02", "email" : "raspberry@gmail.com" }

일반적으로 "$in"은 다음과 같은 상황에 유용하게 사용될 수 있다. 예를 들어, 각 고객의 당첨번호가 6개의 숫자라고 하자. 6개의 숫자 중 2, 35, 42의 세 개의 숫자의 당첨번호를 가지고 있는 고객을 추첨한다고 하면 "$in"을 통해 이 숫자들을 가지고 있는 고객을 추출할 수 있다.

"$or"은 제시되는 조건을 모두 포함하는 도큐먼트들을 검색해 낸다. 예를 들어 "name"이 "ghcoi"이거나 "age"가 34인 고객을 검색한다고 하면,

> db.customers.find({"$or" : [{name: "gchoi"},{age: 34}]})
{ "_id" : ObjectId("52ec746ef97299c19188c2d0"), "name" : "gchoi", "age" : 37, "birthday" : "08/22", "email" : "cinema4dr12@gmail.com" }
{ "_id" : ObjectId("52ec746ef97299c19188c2d4"), "name" : "jhlee", "age" : 34, "birthday" : "07/12", "email" : "ijabul@gmail.com" }

눈치빠른 분들은 예상하시겠지만 "$or"이 있으면 "$and"도 있다. 우선 이를 설명하기 위해 "jmpark"과 생일이 같은 고객 한 명을 추가하도록 하겠다.

> db.customers.insert({name: "dsha", age: 47, birthday: "04/02", email: "hds66@gmail.com"})
> db.customers.find()
{ "_id" : ObjectId("52ec746ef97299c19188c2d0"), "name" : "gchoi", "age" : 37, "birthday" : "08/22", "email" : "cinema4dr12@gmail.com" }
{ "_id" : ObjectId("52ec746ef97299c19188c2d1"), "name" : "jmpark", "age" : 25, "birthday" : "04/02", "email" : "raspberry@gmail.com" }
{ "_id" : ObjectId("52ec746ef97299c19188c2d2"), "name" : "tjkwak", "age" : 32, "birthday" : "11/11", "email" : "ozerodie@gmail.com" }
{ "_id" : ObjectId("52ec746ef97299c19188c2d3"), "name" : "hskim", "age" : 36, "birthday" : "12/08", "email" : "codeblender@gmail.com" }
{ "_id" : ObjectId("52ec746ef97299c19188c2d4"), "name" : "jhlee", "age" : 34, "birthday" : "07/12", "email" : "ijabul@gmail.com" }
{ "_id" : ObjectId("52ec746ff97299c19188c2d5"), "name" : "dwseo", "age" : 33, "birthday" : "05/05", "email" : "cram@gmail.com" }
{ "_id" : ObjectId("52ec89a6f97299c19188c2d6"), "name" : "dsha", "age" : 47, "birthday" : "04/02", "email" : "hds66@gmail.com" }

"jmpark"과 "dsha"는 다른 것은 모두 다르지만 생일은 같다. 만약 생일이 "04/02"를 기준으로 고객을 검색하면 "jmpark"과 "dsha"가 모두 검색될 것이다.

> db.customers.find({birthday: "04/02"})
{ "_id" : ObjectId("52ec746ef97299c19188c2d1"), "name" : "jmpark", "age" : 25, "birthday" : "04/02", "email" : "raspberry@gmail.com" }
{ "_id" : ObjectId("52ec89a6f97299c19188c2d6"), "name" : "dsha", "age" : 47, "birthday" : "04/02", "email" : "hds66@gmail.com" }

이제 "$and" 생일이 "04/02"이고 나이가 25인 고객을 검색해 보자. "$and"는 제시되는 검색 기준을 모두 만족하는 도큐먼트를 검색한다.

> db.customers.find({"$and" : [{birthday: "04/02"},{age: 25}]})
{ "_id" : ObjectId("52ec746ef97299c19188c2d1"), "name" : "jmpark", "age" : 25, "birthday" : "04/02", "email" : "raspberry@gmail.com" }

예상했던 바와 같이 상기 두 가지 조건을 모두 만족하는 "jmpark" 만이 검색 되었음을 확인할 수 있다.

* 쿼리에서 동일한 키를 두 번 변경하는 것을 허용치 않는다. 예를 들어 {"$inc" : {"age" : 1}, "$set" : {age : 40}}은 허용되지 않는다. 왜냐하면, "age"를 두 번 변경하려고 하였기 때문이다.

Comments