use nodejs // 데이터베이스 생성, 데이터가 있어야 생성
// db: 선택된 데이터베이스, students: 컬렉션, insertOne: 문서를 한 개 저장
db.students.insertOne({name:"김사과", age:20, job:"프로그래머"})
// 문서 전체 조회
db.students.find()
db.students.find().pretty()
// 문서를 여러 개 저장
db.students.insertMany([
{name:"반하나", age:25, job:"공무원"},
{name:"이메론", age:30, job:"의사"},
{name:"오렌지", age:33, job:"교직원"}
])
// 문서 업데이트
db.students.updateOne({name:'반하나'}, {$set:{age:22}})
// 문서 삭제
db.students.deleteOne({name:'오렌지'})
// 컬렉션 삭제
db.students.drop()
// 데이터베이스 삭제
db.dropDatabase()
db.students.find().pretty() : students라는 컬렉션에 저장된 모든 문서를 보기 좋게 출력할 때 사용한다.
pretty() : 가져온 결과를 보기 좋게(들여쓰기와 줄바꿈 포함) 출력해 준다.
{
"_id": ObjectId("607c191e810c19729de860ea"),
"name": "김민수",
"age": 20,
"major": "컴퓨터공학"
}
{
"_id": ObjectId("607c191e810c19729de860eb"),
"name": "이수정",
"age": 22,
"major": "수학"
}
예를 들면 위에 보이는 코드↑ 처럼 저런 식으로 보기 좋게 출력해준다고 한다!
db.students.insertMany([
{name:"김사과", age:20, major:"컴퓨터공학", grade:3.8},
{name:"반하나", age:23, major:"수학", grade:3.4},
{name:"오렌지", age:25, major:"물리", grade:3.6},
{name:"이메론", age:30, major:"수학", grade:3.9},
{name:"채애리", age:33, major:"컴퓨터공학", grade:3.2}
])
// 모든 문서 보기
db.students.find()
$gt: 크다
$gte: 크거나 같다
$lt: 작다
$lte: 작거나 같다
$eq: 같다
$ne: 같지 않다
db.students.find({age:23})
// 21살보다 나이가 많은 학생
db.students.find({age:{$gt:21}})
// 컴퓨터공학 전공이 아닌 학생
db.students.find({major:{$ne:"컴퓨터공학"}})
$and: 모두 만족
$or: 하나라도 만족
$not: 조건 부정
$nor: 모두 불만족
// 나이가 21세 이상이면서 전공이 수학인 학생
db.students.find({
$and:[
{age:{$gte:21}},{major:"수학"}
]
})
// 나이가 20세이거나 전공이 물리인 학생
db.students.find({
$or:[
{age:20},{major:"물리"}
]
})
$in 배열에 포함
$nin 배열에 포함되지 않음
// 전공이 수학 또는 물리인 학생
db.students.find({
major:{$in:["수학","물리"]}
})
sort(): 오름차순(1), 내림차순(-1)
// 나이로 내림차순으로 정렬
db.students.find().sort({age:-1})
// 성적으로 오름차순 정렬
db.students.find().sort({grade:1})
limit(): 지정한 수 만큼만 결과 출력
skip(): 처음 몇 개 결과를 건너뜀
// 상위 2명만 보기
db.students.find().limit(2)
// 2명을 건너뛰고 나머지 보기
db.students.find().skip(2)
// 전공이 수학 또는 물리인 학생 중 성적이 3.3 이상인 학생을 성적 높은 순으로 2명만 조회
db.students.find({
$and:[
{major:{$in:["수학","물리"]}}, {grade:{$gte:3.3}}
]
}).sort({grade:-1}).limit(2)
- MongoDB에서 각 문서(document)는 고유한 _id값을 가짐
-_id값을 자동으로 생성하며 해당 값이 ObjectId
- 12바이트 고유 값으로 24자리 16진수 문자열
- 생성시간, 서버정보, 프로세스ID 카운터를 조합해 만들어진 고유값
db.students.find({_id: ObjectId("681c0c177cfeb6069b441534")})
db.students.find()
db.students.updateOne({_id: ObjectId("681c0c177cfeb6069b441536")},
{$set:{name:"채리"}})
ObjectId("681c0c177cfeb6069b441536").getTimestamp()
여러 문서를 묶어서 계산하거나 변형하거나 요약할 때 사용
1. aggregation pipeline (파이프라인 단계별 처리) <- 많이 사용
여러 단계로 이루어진 작업 흐름, 각 단계에서 문서를 입력 받아 처리하고, 다음 단계로 넘김
$match: 조건에 맞는 문서만 선택(SQL WHERE와 비슷)
$group: 특정 키로 그룹화하고, 그룹별로 합계, 평균 등을 계산(SQL GROUP BY와 비슷)
$project: 필요한 필드만 선택하거나 새로운 필드를 계산
$sort: 정렬
$limit: 결과 개수 제한
$skip: 지정한 개수만큼 건너뜀
$lookup: 다른 컬렉션과 조인
$unwind: 배열 필드를 문서별로 펼침
2. Map-reduce (대용량 데이터용)
db.users.insertMany([
{
_id:1,
name:"김사과",
age: 20,
gender: "여",
joinDate: ISODate("2023-01-10T00:00:00Z"),
tags: ["몽고DB", "집계"],
orders:[
{orderId: 101, amount: 200000, orderDate: ISODate("2024-01-15T00:00:00Z")},
{orderId: 102, amount: 450000, orderDate: ISODate("2024-03-22T00:00:00Z")},
],
products:[
{productId: "p1", category: "전자제품", price: 500000, rating: 4.8},
{productId: "p2", category: "의류", price: 50000, rating: 4.2},
]
},
{
_id:2,
name:"반하나",
age: 25,
gender: "여",
joinDate: ISODate("2024-02-20T00:00:00Z"),
tags: ["데이터베이스", "몽고DB"],
orders:[
{orderId: 103, amount: 300000, orderDate: ISODate("2024-02-18T00:00:00Z")}
],
products:[
{productId: "p3", category: "전자제품", price: 120000, rating: 4.6}
]
},
{
_id:3,
name:"오렌지",
age: 30,
gender: "남",
joinDate: ISODate("2024-03-05T00:00:00Z"),
tags: ["몽고DB", "집계", "데이터베이스"],
orders:[],
products:[
{productId: "p4", category: "의류", price: 80000, rating: 4.1}
]
}
])
db.users.aggregate([{$match:{}}])
// 30세 이상인 사람만 선택
db.users.aggregate([{$match:{age:{$gte:30}}}])
// 이름과 나이만 보여주기
db.users.aggregate([
{$project: {name:1, age:1, _id:0}}
])
// 모든 사용자의 평균 나이 구하기
// _id: null 데이터를 한 덩어리로 묶음
db.users.aggregate([
{$group:{_id:null, avgAge:{$avg:"$age"}}}
])
// 성별로 인원 수 세기
db.users.aggregate([
{$group:{_id:"$gender", count:{$sum:1}}}
])
// 나이가 많은 순으로 상위 2명만 보기
db.users.aggregate([
{$sort:{age:-1}},
{$limit: 2}
])
// 연도별 가입자 수 구하기
db.users.aggregate([
{
$group:{
_id: {$year:"$joinDate"},
userCount: {$sum : 1}
}
},
{$sort: {"_id":1}}
])
// 태그별로 몇 번 등장했는지 세기
db.users.aggregate([
{$unwind:"$tags"},
{$group:{_id:"$tags", count:{$sum:1}}},
{$sort:{count:-1}}
])
// 사용자별 총 구매 금액 구하기
db.users.aggregate([
{$unwind: "$orders"},
{
$group:{
_id: "$_id",
total: {$sum: "$orders.amount"}
}
}
])
// 카테고리별 평균/최고 가격
// $avg, $max
db.users.aggregate([
{$unwind: "$products"},
{
$group:{
_id: "$products.category",
avgPrice: {$avg: "$products.price"},
maxPrice: {$max: "$products.price"}
}
}
])
// 평점 4.5 이상인 전자제품만 보기
db.users.aggregate([
{ $unwind: "$products" },
{ $match: { "products.category": "전자제품", "products.rating":{$gte:4.5} }},
{$sort:{"products.rating": -1}}
])
// 2024년 월별 매출 계산하기
db.users.aggregate([
{$unwind: "$orders"},
{
$match: {
"orders.orderDate": { $gte: ISODate("2024-01-01"), $lte: ISODate("2024-12-31") }
}
},
{
$group:{
_id: {month: {$month: "$orders.orderDate"}},
totalSales:{$sum: "$orders.amount"}
}
},
{$sort: {"_id.month":1}}
])