MongoDB 명령어

Database 생성

`use` 메소드만으로 `DB` 생성과 변경이 가능함.

use blog

 

Collection 생성

`createCollection()` 을 통해 콜렉션을 생성. 

db.createCollection("posts")

 

 

데이터 생성

`insertOne()` 은 하나의 데이터를 입력하는데 사용. 입력시에 내용을 `JSON`형식 으로 입력, `MongoDB` 는 `BSON` 타입을 지원하기에 가능함. 

db.posts.insertOne({
  title: "Post Title 1",
  body: "Body of post.",
  category: "News",
  likes: 1,
  tags: ["news", "events"],
  date: Date()
})

 

`insertMany()` 는 여러개의 데이터를 입력하는데 사용함. 입력 하는 데이터를 배열 값으로 입력가능함. 

db.posts.insertMany([  
  {
    title: "Post Title 2",
    body: "Body of post.",
    category: "Event",
    likes: 2,
    tags: ["news", "events"],
    date: Date()
  },
  {
    title: "Post Title 3",
    body: "Body of post.",
    category: "Technology",
    likes: 3,
    tags: ["news", "events"],
    date: Date()
  },
  {
    title: "Post Title 4",
    body: "Body of post.",
    category: "Event",
    likes: 4,
    tags: ["news", "events"],
    date: Date()
  }
])

 

데이터 찾기

`MongoDB`에서는 데이터를 찾기 위해서 `find()` 와 `findOne()` 메소드를 지원하고 있음.

`find()` 함수는 말 그대로 여러 개의 데이터를 찾기 위한 함수임.

db.posts.find()

`findOne()`은 하나의 데이터를 찾기위한 함수임. 

db.posts.findOne()

세부적인 데이터를 찾기 위해서 `JSON Data`를 함수내 인자로 제공해주면 됨.

db.posts.find( {category: "News"} )

 

projection

`projection` 옵션을 통해 원하는 속성값만 가져올 수 있음.

가져오고자 하는 속성에는 1 이라는 값을 부여 해주면 됨. 

db.posts.find({}, {title: 1, date: 1})

`_id` 는 1을 입력학지 않아도 기본적이로 제공이 되고 있는 필드임. 

명시적으로 제외하고자 하면 `_id` 에 0을 부여 해주면 됨. 

db.posts.find({}, {_id: 0, title: 1, date: 1})

동일한 객체에 0과 1 모두 사용하려고 하면 에러가 발생함. 

db.posts.find({}, {title: 1, date: 0})

MongoServerError: Cannot do exclusion on field date in inclusion projection

 

데이터 변경

데이터 변경을 할 때는 `updateOne()` 과 `updateMany()` 를 통해 수행할 수 있음.

하나의 문서를 변경하고자 하면 `updateOne()` 을 사용. 

여기 새롭게 입력되어지는 값들은 $set 을 이용하여 명시하여야 함. 

db.posts.updateOne( { title: "Post Title 1" }, { $set: { likes: 2 } } )

`upsert` 옵션을 사용하게 되면 `update or create` 기능이 수행이 됨. 

db.posts.updateOne( 
  { title: "Post Title 5" }, 
  {
    $set: 
      {
        title: "Post Title 5",
        body: "Body of post.",
        category: "Event",
        likes: 5,
        tags: ["news", "events"],
        date: Date()
      }
  }, 
  { upsert: true }
)

여러 문서를 변경하고자 하면 `updateMany()` 를 사용.

db.posts.updateMany({}, { $inc: { likes: 1 } })

여기서 사용된 `$inc` 는 값을 +1 증가 시켜주는 기능임. 

 

데이터 삭제

데이터를 삭제할 때는` deleteOne()` 과 `deleteMany()` 를 사용함. 

하나의 데이터를 삭제할 때는 `deleteOne()`을 사용. 

db.posts.deleteOne({ title: "Post Title 5" })

 

여러 개의 데이터를 삭제할 때는 `deleteMany()`를 사용.

db.posts.deleteMany({ category: "Technology" })

 

쿼리 연산자

연산자 설명
$eq '=' 연산자
$neq '!=' 연산자
$gt '>' 연산자
$gte '>=' 연산자
$lt '<' 연산자
$lte '<=' 연산자
$in 'in' 연산자

 

논리적 연산자

연산자 설명
$and 두 개의 조건이 모두 충족하면 반환
$or 둘 중 하나만 충족하면 반환
$nor 둘 다 불충족 하면 반환
$not 쿼리가 일치하지 않으면 반환

 

평가용 연산자

연산자 설명
$regex 정규식 사용을 허용
$text 텍스트 검색을 허용
$where 자바스크립트 표현식 사용을 허용

 

변경 연산자

변경 연산자는 필드에 사용할 수 있는 연산자와 배열에 사용할 수 있는 연산자로 구분이됨. 

 

필드용 연산자

연산자 설명
$currentDate date 필드에 현재 날짜값을 입력
$inc 값을 증가
$rename 필드의 명을 변경
$set 값을 지정
$unset 필드를 삭제

 

배열용 연산자

연산자 설명
$addToSet 중복값을 제거한 값을 추가
$pop 배열의 첫번째 또는 마지막 값을 제거
$pull 쿼리 조건에 만족하는 모든 값을 배열에서 제거
$push 배열에 값을 추가 

 

Aggregation Pipelines

집계 연산자를 사용하면 통계, 데이터 분석, 그룹화 등 여러가지 일을 처리할 수 있음. 

집계 파이프라인에는 하나 이상의 단계를 가질 수 있으며, 이전 단계에 따라 다음 결과가 달라짐. 

 

group

그룹기능은 쿼리에 입력된 데이터를 기준으로 그룹화 하는 기능.

db.listingsAndReviews.aggregate(
    [ { $group : { _id : "$property_type" } } ]
)

[
  { _id: 'Aparthotel' },
  { _id: 'Apartment' },
  { _id: 'Barn' },
  { _id: 'Bed and breakfast' },
  { _id: 'Boat' },
            ...
]

 

limit

제한 기능은 다음 단계로 넘어가는 데이터의 수를 제한함. 

db.movies.aggregate([ { $limit: 1 } ]) -- 한개의 데이터만 보여짐

 

project

문서에서 불러오고자 하는 속성을 지정할 수 있음. 

db.restaurants.aggregate([
  {
    $project: {
      "name": 1,
      "cuisine": 1,
      "address": 1
    }
  },
  {
    $limit: 5
  }
])

 

sort

정렬에 대한 내용을 지정할 수 있음. 

db.listingsAndReviews.aggregate([ 
  { 
    $sort: { "accommodates": -1 } 
  },
  {
    $project: {
      "name": 1,
      "accommodates": 1
    }
  },
  {
    $limit: 5
  }
])

 

match

대량의 데이터에서 원하는 값을 필터링 할 수 있음. 

db.listingsAndReviews.aggregate([ 
  { $match : { property_type : "House" } },
  { $limit: 2 },
  { $project: {
    "name": 1,
    "bedrooms": 1,
    "price": 1
  }}
])

 

addFields

파생 속성을 추가 할 수 있는 기능. 

`grades.score` 값의 평균이 각 문서의 `avgGrade` 라는 속성으로 입력됨. 

db.restaurants.aggregate([
  {
    $addFields: {
      avgGrade: { $avg: "$grades.score" }
    }
  },
  {
    $project: {
      "name": 1,
      "avgGrade": 1
    }
  },
  {
    $limit: 5
  }
])

 

 

count

최종적으로 나오는 문서의 수를 반환하는 기능. 

`totalChinese` 라는 속성명으로 반환 됨. 

db.restaurants.aggregate([
  {
    $match: { "cuisine": "Chinese" }
  },
  {
    $count: "totalChinese"
  }
])

 

lookup

기본키 - 외래키로 관계를 가진 데이터를 새로운 배열 컬럼에 추가하는 기능. 

  • `from` : 참조 하고자 하는 문서 
  • `localField` : 현재 문서의 컬럼에서 연결된 속성.
  • `foreignField` : 참조 하고 있는 문서에 연결된 속성. 
  • `as` : 배열 값으로 반환 될 속성명. 
db.comments.aggregate([
  {
    $lookup: {
      from: "movies",
      localField: "movie_id",
      foreignField: "_id",
      as: "movie_details",
    },
  },
  {
    $limit: 1
  }
])

 

out

`aggregate pipeline`에서 집계되는 데이터를 다른 컬렉션에 저장하는 기능. 

아래의 쿼리문은 `properties_by_type` 이라는 컬렉션에 저장됨. 

db.listingsAndReviews.aggregate([
  {
    $group: {
      _id: "$property_type",
      properties: {
        $push: {
          name: "$name",
          accommodates: "$accommodates",
          price: "$price",
        },
      },
    },
  },
  { $out: "properties_by_type" },
])

'Backend > DataBase' 카테고리의 다른 글

SQLD 최적화  (0) 2023.11.08
SQL 활용  (0) 2023.11.07
SQL 기본  (1) 2023.11.07
SQL vs NoSQL  (1) 2023.11.03
데이터 모델링과 성능  (1) 2023.11.02