책/몽고DB 완벽 가이드
[4.2] 쿼리 / 쿼리조건($where)
atmosg
2022. 7. 26. 18:19
이전까지 배운 키/값 쌍을 이용하는 방법들로도 충분히 많은 쿼리를 할 수 있지만 완벽한 것은 아니다. 이 때 $where 절은 자바스크립트 코드를 그대로 받아서 실행할 수 있다. JS코드를 그대로 갖다 쓰므로 거의 모든 쿼리를 표현할 수 있다.
다만 DB에 자바스크립트 코드를 그대로 돌린다는 발상 자체는 보안적으로 매우 좋지 않다. 따라서 최대한 자제하는게 좋으며, 사용자(혹은 해커가) $where절이 포함된 구문에 임의의 자바스크립트 코드를 전달하지 못하게 보안 장치를 철저히 마련해둬야 한다. 그 외에도
- 일반 쿼리 대비 속도가 훠어어얼씬 느리다
- $where 절에는 인덱스를 사용할 수 없다
- 일정부분은 대체용으로 $expr 연산자도 있다
보안에 자신 없으면 쓰지말자. 일반 쿼리와 인덱스를 최대한 활용하고도 정말 어쩔 수 없다면 쓰자.
도큐먼트내 필드의 값이 같은 경우를 찾아보자
db.weird.find()
{ "mid" : 1, "top" : 6, "bottom" : 3 }
{ "mid" : 8, "jungle" : 4, "sup" : 4 }
db.weird.find({ $where: function() {
for (let elem in this) {
for (let another in this) {
if (elem !== another && this[elem] === this[another]) {
return true
}
}
}
return false;
}});