일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 빅 데이터
- Big Data
- 빅데이터
- Machine Learning
- c++
- WebGL
- node.js
- MongoDB
- Deep learning
- 인공지능
- 데이터 과학
- 통계
- R
- 빅 데이타
- data science
- No SQL
- 딥러닝
- Artificial Intelligence
- 주일설교
- 김양재 목사
- 김양재 목사님
- 빅데이타
- nodeJS
- openCV
- Statistics
- 김양재
- 확률
- 몽고디비
- 우리들교회
- probability
- Today
- Total
Scientific Computing & Data Science
[MongoDB] Query / find 본문
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"를 두 번 변경하려고 하였기 때문이다.
'Data Science > MongoDB' 카테고리의 다른 글
[MongoDB] Query / $size (1) | 2014.02.01 |
---|---|
[MongoDB] Query / $all (0) | 2014.02.01 |
[MongoDB] Update Modifiers / Part 9. - findAndModify (0) | 2014.01.31 |
[MongoDB] Update Modifiers / Part 8. - Updating Multiple Documents (0) | 2014.01.30 |
[MongoDB] Update Modifiers / Part 7. - Upsert (0) | 2014.01.30 |