Query 연산자를 통해 조금 더 자세한 검색을 할 수 있다.
실습을 위해 inventory라는 collection을 만들어 다음의 document를 입력해보자.
[
{ "_id": 1, "item": { "name": "ab", "code": "123" }, "qty": 15, "tags": [ "A", "B", "C" ], “stock”: 100 },
{ "_id": 2, "item": { "name": "cd", "code": "123" }, "qty": 20, "tags": [ "B" ] , “stock”: 30 },
{ "_id": 3, "item": { "name": "ij", "code": "456" }, "qty": 25, "tags": [ "A", "B" ] , “stock”: 50 },
{ "_id": 4, "item": { "name": "xy", "code": "456" }, "qty": 30, "tags": [ "B", "A" ] , “stock”: 150 },
{ "_id": 5, "item": { "name": "mn", "code": "000" }, "qty": 20, "tags": [ [ "A", "B" ], "C" ] , “stock”: 10 }
]
1) Comparison
- $eq: { <field>: { $eq: <value> } }
같은 값을 찾는 연산자이다. db.inventory.find( { qty: { $eq: 20 } } )를 입력하면 qty가 20인 document를 찾는다. 이는 db.inventory.find( { qty: 20 } )와 같다.
- $gt: { <field>: { $gt: <value> } }
보다 큰 값을 찾는 연산자이다. db.inventory.find( { qty: { $gt: 20 } } )를 입력하면 qty가 20보다 큰 document를 찾는다.
- $gte: { <field>: { $gte: <value> } }
크거나 같은 값을 찾는 연산자이다. db.inventory.find( { qty: { $gte: 20 } } )를 입력하면 qty가 20이상인 document를 찾는다.
- $in: { <field>: { $in: [<value1>, <value2>, ... , <valueN>] } }
값을 포함하는 document를 찾는 연산자이다. db.inventory.find( { qty: { $in: [ 5, 15 ] } } )를 입력하면 qty가 5이거나 15인 document를 찾는다.
- $lt: { <field>: { $lt: <value> } }
보다 작은 값을 찾는 연산자이다. db.inventory.find( { qty: { lt: 20 } } )를 입력하면 qty가 20보다 작은 document를 찾는다.
- $lte: { <field>: { $lte: <value> } }
작거나 같은 값을 찾는 연산자이다. db.inventory.find( { qty: { lte: 20 } } )를 입력하면 qty가 20이하인 document를 찾는다.
- $ne: { <field>: { $ne: <value> } }
같지 않은 값을 찾는 연산자이다. db.inventory.find( { qty: { $ne: 20 } } )를 입력하면 qty가 20이 아닌 document를 찾는다.
- $nin: { <field>: { $in: [<value1>, <value2>, ... , <valueN>] } }
값을 포함하지 않는 document를 찾는 연산자이다. db.inventory.find( { qty: { $nin: [ 5, 15 ] } } )를 입력하면 qty가 5와 15가 아닌 document를 찾는다.
2) Logical
- $and: { $and: [ { <expression1> }, { <expression2> }, ... , { <expressionN> } ] }
and조건으로 연산자를 묶어준다. db.inventory.find( { $and: [ { qty: { $ne: 5 } }, { tags: { $exists: true } } ] } )를 입력하면 qty가 5가 아니고 tags 필드가 존재하는 document를 찾는다.
- $not: { <field>: { $not: { <operator-expression> } } }
조건과 일치하지 않는 document를 찾는 연산자이다. db.inventory.find( { qty: { $not: { $gt: 5 } } } )를 입력하면 qty가 5이하이거나 qty 필드가 없는 document를 찾는다.
- $nor: { $nor: [ { <expression1> }, { <expression2> }, ... , { <expressionN> } ] }
nor조건으로 연산자를 묶어준다. db.inventory.find( { $nor: [ { qty: 5 }, { item.name: “ab” } ] } )를 입력하면 qty가 5가 아니고 item.name이 “ab”가 아닌 document 또는 qty가 5가 아니고 item.name이 존재하지 않는 document 또는 qty가 존재하지 않고 item.name이 “ab”가 아닌 document 또는 qty와 item.name이 존재하지 않는 document를 찾는다.
- $or: { $or: [ { <expression1> }, { <expression2> }, ... , { <expressionN> } ] }
or조건으로 연산자를 묶어준다. db.inventory.find( { $or: [ { qty: { $lt: 20 } }, { item.name: “ab” } ] } )를 입력하면 qty가 20보다 작거나 item.name이 “ab”인 document를 찾는다.
3) Element
- $exists: { <field>: { $exists: <boolean> } }
특정 필드가 있는 document를 찾아주는 연산자이다. db.inventory.find( { qty: { $exists: true, $nin: [ 5, 15 ] } } )를 입력하면 qty필드가 존재하고 그 값이 5나 15가 아닌 document를 찾는다.
- $type: { <field>: { $type: <BSON type> } }
특정 type이 있는 document를 찾아주는 연산자이다. db.inventory.find( { qty: { $type: “array” } } )를 입력하면 qty의 값이 array형식인 document를 찾는다.
4) Evaluation
- $expr: { $expr: { <expression> } }
두 값을 비교하는 연산자이다. db.inventory.find( { $expr: { $gt: [ "$qty" , "$stock" ] } } )를 입력하면 qty의 값이 stock의 값보다 큰 document를 찾는다.
- $mod: { <field>: { $mod: [ <divisor>, <remainder> ] } }
나머지가 일치하는 값을 찾는 연산자이다. db.inventory.find( { qty: { $mod: [ 4, 0 ] } } )를 입력하면 qty를 4로 나눈 나머지의 값이 0인 document를 찾는다.
- $regex: { <field>: /pattern/<options> }
정규 표현식으로 값을 찾는 연산자이다. db. inventory.find( { item.name: { $regex: /^AB/i } } )를 입력하면 item.name에 대소문자를 구분하지 않고 ab가 있는 document를 찾는다.
<options>
∙ i: 대소문자를 무시
∙ m: 정규식에서 anchor(^, $)를 사용 할 때 값에 \n 이 있다면 무시
∙ x: 정규식 안에 있는 white space를 모두 무시
∙ s: dot (.) 사용 할 때 \n을 포함해서 찾음
- $text: { $text: { $search: <string>, $language: <string>,
$caseSensitive: <boolean>, $diacriticSensitive: <boolean> } }
text를 찾아 주는 연산자이다. db.inventory.find( { $text: { $search: "ab" } } )를 입력하면 ab라는 text가 있는 document를 찾는다.
- $where: { $where: <javascript expression> }
Javascript 표현식을 사용가능하게 하는 연산자이다. 다음을 입력하면 qty가 15인 document를 찾는다.
db.inventory.find( { $where: function() {
return (this.qty == 15)
} } );
5) Array
- $all: { <field>: { $all: [ <value1> , <value2>, ... ] } }
모든 조건값이 일치하는 배열을 가진 document를 찾는 연산자이다. db.inventory.find( { tags: { $all: [ "A", "B" ] } } )를 입력하면 tags의 배열에 “A”와 “B”를 포함하는 document를 찾는다.
- $elemMatch: { <field>: { $elemMatch: { <query1>, <query2>, ... } } }
모든 조건이 일치하는 배열의 값이 있는 배열을 가진 document를 찾는 연산자이다. db.inventory.find( { tags: { $elemMatch: { $eq: “A” } } } )를 입력하면 tags의 배열에 “A” 값이 있는 document를 찾는다.
- $size: { <field>: { $size: <value> } }
배열의 요소수가 일치하는 document를 찾는 연산자이다. db.inventory.find( { tags: { $size: 2 } } )를 입력하면 tags배열에 요소가 2개인 document를 찾는다.
이외에도 많은 연산자들이 있다. 자세한 내용은 공식문서를 참고하도록 하자.
'Programming > Database' 카테고리의 다른 글
[03. MongoDB] 007. Index (0) | 2019.12.21 |
---|---|
[03. MongoDB] 006. Cursor (0) | 2019.12.20 |
[03. MongoDB] 004. Document (0) | 2019.12.16 |
[03. MongoDB] 003. Collection (0) | 2019.12.15 |
[03. MongoDB] 002. Database (0) | 2019.12.15 |