비교 연산자
비교 연산자는 지정한 값을 비교하는 연산자다.
{<Field> : {<operator>:<value>}}
- $eq(Equal to):
- $gt(Greater Than)
- $gte(Greator Than or Equal to)
- $ne(Not Equal to)
- $lt(Less Than)
- $lte(Less Than or Equal to)
$gte
tripduration이 1000 보다 크거나 같은 Document들을 추출한다.
db.trips.find({"tripduration":{"$gte": 1000}}).limit(3);
{
_id: ObjectId("572bb8222b288919b68abf5f"),
tripduration: 2321,
'start station id': 3167,
'start station name': 'Amsterdam Ave & W 73 St',
'end station id': 3164,
'end station name': 'Columbus Ave & W 72 St',
bikeid: 24183,
usertype: 'Subscriber',
'birth year': 1963,
'start station location': {
type: 'Point',
coordinates: [ -73.98093044757842, 40.77966809007312 ]
},
'end station location': { type: 'Point', coordinates: [ -73.97898475, 40.7770575 ] },
'start time': ISODate("2016-01-01T00:01:27.000Z"),
'stop time': ISODate("2016-01-01T00:40:08.000Z")
}
$ne
usertype이 subscriber가 아닌 Document를 필터링 한다.
db.trips.findOne({"usertype":{"$ne":"Subscriber"}});
{
_id: ObjectId("572bb8222b288919b68abf6d"),
tripduration: 858,
'start station id': 532,
'start station name': 'S 5 Pl & S 4 St',
'end station id': 401,
'end station name': 'Allen St & Rivington St',
bikeid: 17057,
usertype: 'Customer',
'birth year': '',
'start station location': { type: 'Point', coordinates: [ -73.960876, 40.710451 ] },
'end station location': { type: 'Point', coordinates: [ -73.98997825, 40.72019576 ] },
'start time': ISODate("2016-01-01T00:09:31.000Z"),
'stop time': ISODate("2016-01-01T00:23:49.000Z")
}
논리 연산자
MQL(MongoDB Query Language)에는 4가지 논리 연산자를 제공한다.
- $and : AND 조건
- $or : OR 조건
- $nor : 모든 쿼리와 일치하지 않는 경우
- $not : 뒤의 조건을 만족하지 않는 모든 Document 반환
$and, $or, $nor
{<operator> : [{statement1},{statement2}]}
$and 연산자는 기본적으로 내장되어 있다. 어떤 연산자도 지정하지 않을 경우 자동으로 $and 연산자가 작동한다.
db.inspections.find({$or : [{result:"Pass"},{result:"Violation Issued"}]});
db.inspections.find({$and : [{result:"Pass"},{result:"Violation Issued"}]});
db.inspections.find(result:"Pass",result:"Violation Issued");
db.inspections.find({$nor : [{result:"Pass"},{result:"Violation Issued"}]});
$not
not 연산자는 1개의 statement를 가진다. not 연산자는 독립적으로 사용이 불가능하다. 다른 연산자의 결과를 체크하는 용도로만 사용해야 하며, 독립적으로는 연산이 안된다. 독립적인 논리 연산을 위해서는 $ne 연산자를 사용해야 한다.
{$not : {statement}}
db.inspections.find({result:{$not:{$eq:"Pass"}}}); // 독립적으로 사용 불가
db.inspections.find({result:{$ne:"Pass"}});
{
_id: ObjectId("56d61033a378eccde8a8354f"),
id: '10021-2015-ENFO',
certificate_number: 9278806,
business_name: 'ATLIXCO DELI GROCERY INC.',
date: 'Feb 20 2015',
result: 'No Violation Issued',
sector: 'Cigarette Retail Dealer - 127',
address: {
city: 'RIDGEWOOD',
zip: 11385,
street: 'MENAHAN ST',
number: 1712
}
}
표현 연산자
$expr
표현 연산자(Expressive Query Operator)는 사용도가 높은 연산자다. 높은 표현력으로 다양한 방면에 사용된다. 쿼리 내에서 집계 표현식(Aggregation Expression)를 사용할 수 있으며 변수와 조건문을 사용할 수 있다. 또한 Document내 필드들을 비교할 수 있다.
Document내에서 start station id와 end station id가 같은 Document를 모두 출력한다. 필드값을 비교하기 위해 $expr 연산자를 사용했을 뿐만 아니라 필드인 "start station id"를 변수로 만들어 Document를 비교한다.
db.trips.find({$expr:{$eq:["$start station id","$end station id"]}})
{
_id: ObjectId("572bb8222b288919b68ac3e6"),
tripduration: 172,
'start station id': 368,
'start station name': 'Carmine St & 6 Ave',
'end station id': 368,
'end station name': 'Carmine St & 6 Ave',
bikeid: 16109,
usertype: 'Subscriber',
'birth year': 1989,
'start station location': { type: 'Point', coordinates: [ -74.00214988, 40.73038599 ] },
'end station location': { type: 'Point', coordinates: [ -74.00214988, 40.73038599 ] },
'start time': ISODate("2016-01-01T03:53:46.000Z"),
'stop time': ISODate("2016-01-01T03:56:39.000Z")
}
$expr은 집계 표현식으로도 사용가능하다. 일반 MQL 문법과는 조금 다르다.
db.trips.find({ $expr:
{ $and:
[
{ $gt: ["$birth year", 1990] },
{ $eq: ["$start station name", "$end station name"] }
]
}
});
일반 MQL의 경우 필드가 가장 먼저 오고 연산자 value 순으로 위치한다.
{<Field> : {<operator> : <value>}}
{"birth year" : {$gt : 1990}}
집계 연산자(Aggregation Syntax)의 경우 연산자가 가장 먼저 위치하고 필드, Value 순으로 온다.
{<operator> : {<Field>, <Value>}}
배열 연산자
MongoDB에서 배열을 조작할 수 있는 3개의 연산자를 제공한다. 데이터 타입이 정해져 있지 않기 때문에 Value로 배열을 가질 수 있다.
$push
배열의 마지막 위치에 요소를 추가한다. 배열이 아닌 필드에 사용할 경우 필드 타입을 배열로 변경한다.
{$push : <expression>}
// Document 생성
db.zips.insertOne({"_id":3, "arrData":[1,2,3]})
// 배열 필드 업데이트
db.zips.updateOne({"_id":3}, {$push:{"arrData":"a"}})
{ _id: 3, arrData: [ 1, 2, 3, 4, 'a' ] }
$all
인자로 전달받은 요소를 포함한 모든 Document를 반환한다.
{$all : {"배열 필드":[배열 요소]}}
배열의 일부를 가지고 해당 요소를 포함하고 있는 Document를 검색한다. 검색시 요소의 순서는 관계가 없다. 만약 $all 연산자를 사용하지 않는 경우 순서는 중요한 변수가 된다.
db.zips.find({"arrData":{$all:[4,3,'a']}})
// 검색 결과
[ { _id: 3, arrData: [ 1, 2, 3, 4, 'a' ] } ]
$size
Document내의 배열 필드의 길이를 찾아 반환한다. $size 연산자는 range를 제공하지 않기 때문에 배열의 길이로 Document를 검색하기 위해서는 Document 내에 배열의 길이를 count 할 필드를 생성해야 한다.
배열의 길이가 5인 Document를 검색한다.
db.zips.find({"arrData": {$size:5}})
[ { _id: 3, arrData: [ 1, 2, 3, 4, 'a' ] } ]
Reference
'Programming' 카테고리의 다른 글
[Redux] 리덕스 CRUD ! (0) | 2022.06.01 |
---|---|
[Redux] Redux란? 리덕스 사용법 (0) | 2022.06.01 |
[Database] MongoDB CRUD ! (0) | 2022.05.31 |
[Database] MongoDB Document 데이터 BSON JSON 형식 차이점 (0) | 2022.05.31 |
[Database] MongoDB란? NoSQL, 도큐먼트 데이터베이스, cluster replica set Instance (0) | 2022.05.31 |
댓글