> db.users.find({"username" : "joe", "age" : 27})
// 두번째 매개변수에 필요한 필드를 지정할 수 있음(projection) => 1은 포함, 0은 미포함
> db.users.find({}, {"username" : 1, "email" : 1})
> db.users.find({}, {"fatal_weakness" : 0})
// 쿼리 도큐먼트 값은 항상 상수 → 도큐먼트 내의 다른 객체를 참조할 수 없음
// stock 컬렉션의 도큐먼트 중 num_sold 키의 값을 참조할 수 없다.
> db.stock.find({"in_stock" : "this.num_sold"}) // 작동안함.
// $lt, $lte, $gt, $gte
> db.users.find({"age" : {"$gte" : 3, "$lte" : 30}})
// $ne
> db.users.find({"username" : {"$ne" : "joe"}})
> start = new Date("01/01/2007")
> db.users.find({"registered" : {"$lt" : start}})
// $in -> 다른 데이터 형도 쓸 수 있음
> db.users.find({"user_id" : {"$in" : [12345, "joe"]}})
// $nin -> not in
> db.raffle.find({"ticket_no" : {"$nin" : [725, 542, 390]}})
// $or 서로다른 조건절
> db.raffle.find({"$or" : [{"ticket_no" : {"$in" : [725, 764, 390]}},{"winner" : true}]})
일반적인 AND 쿼리에서는 최소한의 인수로 최적의 결과를 추려내야한다. OR 쿼리는 반대인데, 첫번째 인수가 일치하는 도큐먼트가 많을 수록 효과적이다. ****가능한 한 $in을 사용하자. 쿼리 옵티마이저는 $in 을 더 효율적으로 다룬다.
$not
// id_num 키의 값에 5로 나눴을때 나머지가 1이 아닌 도큐먼트 추출
> db.users.find({"id_num" : {"$not" : {"$mod" :[5, 1]}}})
// 키 z가 없는 도큐먼트들도 추출되기 때문에 이를 방지하려면 extists 사용
> db.c.find({"z" : {"$eq" : null, "$exists" : true}})
> db.users.find( {"name" : {"$regex" : /joe/i } })
// fruit 키의 배열 값이 apple과 banana를 모두 포함하는 도큐먼트
> db.food.find({"fruit" :{$all : ["apple", "banana"]}})
// fruit 배열의 2번째 요소가 peach인것 반환
> db.food.find({"fruit.2" : "peach"})
// 배열의 총 개수 $size
> db.food.find({"$size" : {"$gt" : 3}})
// $slice는 다른 연산자와 달리 명시하지 않은 키도 반환한다.
// 배열 요소의 부분 집합 $slice -> -10은 from tail, 10은 from head
> db.blog.posts.findOne(criteria, {"comments" : {"$slice" : 10}})
// offset이후부터 n개
> db.blog.posts.findOne(criteria, {"comments" : {"$slice" : [23, 10]})
// 배열요소찾기
// comments 배열의 name이 bob이고 그중 comments만 반환하되 $로 인해 최초 1개만 반환
> db.blog.posts.find({"comments.name" : "bob"}, {"comments.$" : 1})
{
// title: ""
comments : [ { name: "bob", content: "b"} ],
// author: ""
}
// 범위쿼리
> db.test.find({"x" : {"$gt" : 10, "$lt" : 20}})
// 결과
{"x" : 15}
{"x" : [5, 25]} //하나라도 포함되면 추가됨
//$elemMatch -> 모든 배열 요소가 매치되는지 체크
> db.test.find({"x" : {"$elemMatch" : {"$gt" : 10 , "$lt" : 20}}})
// 결과 없음 ! 5는 배열이 아니라 패스, [5, 25] 는 모든 요소가 10~20 사이가 아니기때문에 패스
// 일반적으로 한 필드에 배열값과 스칼라값을 함께 저장하는 것은 추천하지 않음
> db.test.find({"x" : {"$gt" : 10, "$lt" : 20}}).min({"x" : 10}).max({"x" : 20})
// 배열에 범위 쿼리를 할때 min/max 사용하면 좋은 gt, lt 쿼리의 인덱스 한계는 비효율적이다.
// 어떤 값이든 허용하므로 범위 내뿐 아니라 모든 인덱스 항목을 검색한다.
// 이 경우 middle name 필드가 추가된다면 전체 도큐먼트가 일치하지 않으므로 작동하지 않게 됨
> db.people.find({"name" : {"first" : "Joe", "last" : "Schmoe"}})
// 점 표기법 사용하여 특정 키로 쿼리하는 것이 좋음.
> db. people.find({"name.first" : "Joe", "name.last" : "Schmoe"})