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 |