일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- probability
- 확률
- Machine Learning
- 빅 데이터
- Artificial Intelligence
- 빅 데이타
- nodeJS
- MongoDB
- openCV
- node.js
- No SQL
- 빅데이타
- 주일설교
- 김양재 목사님
- 통계
- Deep learning
- Big Data
- WebGL
- 딥러닝
- R
- 우리들교회
- 몽고디비
- 빅데이터
- 데이터 과학
- c++
- Statistics
- data science
- 김양재
- 인공지능
- 김양재 목사
- Today
- Total
Scientific Computing & Data Science
[MongoDB] Query / $where 본문
Written by cinema4d
이번 글에서는 "$where" 오퍼레이터에 대해 알아보도록 하겠다.
"$where" JavaScript의 표현 또는 JavaScript 함수 전체를 쿼리에 전달할 수 있는 오퍼레이터이다.
설명을 위해 우선 다음 데이터를 준비하자.
db.grade.insert({student_id : "01", korean : "A", english: "B", maths : "A+", science : "A" })
db.grade.insert({student_id : "02", korean : "B", english: "B", maths : "A+", science : "B" })
db.grade.insert({student_id : "03", korean : "C", english: "A+", maths : "A+", science : "A" })
위에 입력된 데이터를 살펴보면 다음과 같다.
> db.grade.find().pretty() { "_id" : ObjectId("52efaab7614cff87320cc801"), "student_id" : "01", "korean" : "A", "english" : "B", "maths" : "A+", "science" : "A" } { "_id" : ObjectId("52efaab7614cff87320cc802"), "student_id" : "02", "korean" : "B", "english" : "B", "maths" : "A+", "science" : "B" } { "_id" : ObjectId("52efaab8614cff87320cc803"), "student_id" : "03", "korean" : "C", "english" : "A+", "maths" : "A+", "science" : "A" }
참고로 "find()" 명령에 뒤에 있는 "pretty()"는 검색된 도큐먼트 내용을 잘 정리해서 보여주는 메써드이다.
"$where"를 이용하여 국어(korean)와 과학(science) 등급이 같은 학생을 추출해 보자.
> db.grade.find({ $where: function() { return (this.korean == this.science) }}).pretty(); { "_id" : ObjectId("52efaab7614cff87320cc801"), "student_id" : "01", "korean" : "A", "english" : "B", "maths" : "A+", "science" : "A" } { "_id" : ObjectId("52efaab7614cff87320cc802"), "student_id" : "02", "korean" : "B", "english" : "B", "maths" : "A+", "science" : "B" }
국어와 과학 등급이 같은 학생의 ID는 "01"과 "02"이다. 이와 같이 "$where"는 JavaScript 함수를 사용하여 쿼리의 확장이 가능하게 한다. "this" 키워드가 사용되었음에 유의하자.
유사하게 이번에는 영어(english)와 수학(maths) 등급이 같은 학생을 추출하려면 다음과 같이 입력한다.
> db.grade.find({ $where: function() { return (this.english == this.maths) }}).pretty(); { "_id" : ObjectId("52efaab8614cff87320cc803"), "student_id" : "03", "korean" : "C", "english" : "A+", "maths" : "A+", "science" : "A" }
영어와 수학 등급이 같은 ID "03"의 학생이 검색되었음을 확인할 수 있다.
"this" 대신 "obj"를 사용해도 동일한 결과를 얻을 수 있다.
> db.grade.find({ $where: function() { return (obj.english == obj.maths) }}).pretty(); { "_id" : ObjectId("52efaab8614cff87320cc803"), "student_id" : "03", "korean" : "C", "english" : "A+", "maths" : "A+", "science" : "A" }
함수 형태로 표현된 위의 표현은 보다 간단하게 다음과 같이 표현할 수 있으며, 결과는 동일하다.
> db.grade.find( { $where: "obj.english == obj.maths" } ).pretty(); { "_id" : ObjectId("52efaab8614cff87320cc803"), "student_id" : "03", "korean" : "C", "english" : "A+", "maths" : "A+", "science" : "A" }
MongoDB의 정규 오퍼레이터로는 처리할 수 없는 것도 이를 사용해 처리가 가능하므로 확장 측면에서는 매우 유용하나, 동일한 데이터 처리를 하는 정규 오퍼레이터가 존재한다면 가급적 쓰지 않도록 한다. 즉, 정말로 꼭 필요한 상황이 아니면 절대 써서는 안 된다.
왜냐하면, 정규 오퍼레이터보다 처리속도가 현저히 떨어지기 때문이다.
'Data Science > MongoDB' 카테고리의 다른 글
[MongoDB] Query / skip 속도 높이기 (0) | 2014.02.06 |
---|---|
[MongoDB] Query / Cursors (0) | 2014.02.06 |
[MongoDB] Query / Querying Embedded Documents (0) | 2014.02.02 |
[MongoDB] Query / $slice (0) | 2014.02.01 |
[MongoDB] Query / $size (1) | 2014.02.01 |