본문 바로가기
Programming

[Database] MongoDB operators list, 연산자 종류 사용법

by 개발자 염상진 2022. 5. 31.

 

비교 연산자

 

비교 연산자는 지정한 값을 비교하는 연산자다.

 

{<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

 

 

 

[Database] MongoDB CRUD !

Create MongoDB의 모든 Document들은 고유한 값인 "_id"를 가진다. _id 필드 값은 Document를 구별한 역할을 수행한다. Document 내부의 필드 값이 동일한 경우에도 _id 값이 다를 경우 서로 다른 Document가 된..

about-tech.tistory.com

 

 

[Database] MongoDB Document 데이터 BSON JSON 형식 차이점

MongoDB Document MongoDB에서 Document란 객체와 유사하게 Field ~ value로 데이터를 저장하고 구성한다. Document에서 필드는 데이터의 고유한 식별자가 되고, 값은 식별자와 관련된 데이터를 의미한다. 이 처

about-tech.tistory.com

 

댓글