Node.js 교과서 8장을 공부하고
⚠️ 본 포스팅은 매주 Node.js를 공부하고, 동아리 스터디원들과 함께 스터디한 내용을 정리하는 곳입니다.
⚠️ 모든 내용을 기록하려고 하기 보다는 함축하고 필요한 내용만 작성하고 있습니다.
https://github.com/gilbutITbook/080229
8 MongoDB
NoSQL vs. SQL
- 고정된 테이블이 없고 자유로운 데이터 입력이 가능
- 확장성과 가용성, 속도
- 컬렉션 간 JOIN을 지원하지 않음 (비슷하게는 가능)
MongoDB CRUD
Create
컬렉션에 컬럼을 정의하지 않아도 되므로 컬렉션에는 아무 데이터나 넣을 수 있다.
이것은 몽고디비의 장점이기도 하지만 무엇이 들어올지 모른다는 것이 단점이기도 하다.
- 다큐먼트 생성
> db.컬렉션명.save(다큐먼트)
Read
- 다큐먼트 조회
> db.컬렉션명.find({});
- 특정 필드만 조회
> db.컬렉션명.find({}, {_id:0, name:1, married: 1});
- gt 특수 속성 사용하기
> db.users.find({ age: {$gt: 30}, married: true}, {_id:0, name: 1, age: 1});
- 몽고디비 or 연산
> db.users.find({ $or: [{ age: {$gt: 30}}, {married: false}]}, {_id: 0, name: 1, age: 1});
- 정렬
> db.users.find({}, {_id: 0, name: 1, age: 1}).sort({ age: -1})
- 조회할 다큐먼트 개수 설정
> db.users.find({}, {_id: 0, name: 1, age: 1}).sort({ age: -1 }).limit(1)
- 다큐먼트 개수를 설정하면서 몇 개를 건너뛸지 설정할 수 있다.
> db.users.find({}, {_id: 0, name: 1, age: 1 }).sort({ age: -1}).limit(1).skip(1)
Update
> db.users.update({ name: 'nero' }, { $set: { comment: '안녕하세요. 수정한 필드입니다.' } });
Delete
> db.users.remove({ name: 'nero' })
Mongoose
index.js
const mongoose = require('mongoose');
const connect = ()=>{
if (process.env.NODE_ENV !== 'production'){
mongoose.set('debug',true);
}
mongoose.connect('mongodb://사용자이름:비밀번호@localhost:27017/admin',{
dbName: 'nodejs',
useNewUrlParser: true,
useCreateIndex: true,
},(error)=>{
if (error){
console.log('몽고디비 연결 에러',error);
} else {
console.log('몽고디비 연결 성공');
}
});
};
mongoose.connection.on('error',(error)=>{
console.error('몽고디비 연결 에러',error);
});
mongoose.connection.on('disconnected',()=>{
console.error('몽고디비 연결이 끊겼습니다. 연결을 재시도합니다.');
connect();
});
module.exports = connect;
몽고디비를 연결 및 연결 확인
users.js
const mongoose = require('mongoose');
const { Schema } = mongoose;
const userSchema = new Schema({
name: {
type: String,
required: true,
unique: true,
},
age:{
type: Number,
required: true,
},
married:{
type: Boolean,
required: true,
},
comment: String,
createAt: {
type:Date,
default: Date.now,
},
});
module.exports = mongoose.model('User',userSchema);
user 컬렉션 name, age, married, comment, comment, createAt
comment.js
const mongoose = require('mongoose');
const { Schema } = mongoose;
const { Types:{ ObjectId }} = Schema;
const commentSchema = new Schema({
commenter:{
type: ObjectId,
required: true,
ref: 'User', //commenter 필드에 User 스키마의 사용자 ObjectId가 들어감
},
comment:{
type: String,
required: true,
},
createAt:{
type: Date,
default: Date.now,
},
});
module.exports = mongoose.model('Comment',commentSchema);
comment 컬렉션 commenter, comment, createAt