find
query는 지금까지 다룬 내용에서 가장 많이 사용된 query입니다.
가장 기본적인 query 중 하나로서 검색 조건에 대해 좀 더 알아보도록 하겠습니다.
우선 다음과 같이 데이터를 준비하도록 하겠습니다:
> 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 조건(Query Conditionals)
가장 일반적으로 많이 사용되는 query 조건에는 $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" 만이 검색 되었음을 확인할 수 있습니다.
주의사항 : query에서 동일한 키를 두 번 변경하는 것을 허용치 않습니다. 예를 들어 {"$inc" : {"age" : 1}, "$set" : {age : 40}}
은 허용되지 않습니다. 왜냐하면, age
를 두 번 변경하려고 하였기 때문입니다.