티스토리 뷰
윈도우
몽고디비 실행할려면
c:\data\db 폴더가 있어야 돼. 먼저 만들어.
몽고디비 서버 실행
cd C:\Program Files\MongoDB\Server\4.4\bin
mongod or ./mogod
기본적으로 27017번 포트에서 실행된다. mysql은 3306이였나??
매번 실행하기 귀찮다면 명령 프롬프트를 관리자 권한으로 실행한 뒤 (버전 4.2는 버전에따라 바꿔요)
mongod --dbpath "C:\data\db" --logpath "C:\Program Files\MongoDB\Server\4.2\log\mongod.log" -- install --serviceName "MongoDB"
명령어 입력 후 윈도 작업 표시줄 검색창에서 services.msc 파일을 검색하여 실행
mongodb 찾아서 실행중으로 바꿔
중지하고 싶으면 중지하면 돼. 여기서 . 다시시작이나
서버가 실행된 상태에서
mongo
> use admin
switched to db admin
> db.createUser({user:'이름', pwd:'비밀번호', roles:['root']})
Successfully added user: { "user" : "이름", "roles" : [ "root" ] }
(이름 비밀번호는 바꿔)
(createUser로 계정을 생성.)
mongod --auth로 접속 (--auth는 로그인이 필요하다는 뜻)
mongo admin -u 이름 -p 비밀번호
리눅스(우분투)
명령어는 공식사이트에서 참고
docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu/
wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu focal/mongodb-org/4.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list
sudo apt-get update
sudo apt-get install -y mongodb-org
실행
sudo systemctl start mongod
sudo systemctl enable mongod
종료, 재시작
sudo systremctl stop mongod
sudo systemctl restart mongod
mongo 입력했을 때 >나오면 성공
누구나 몽고디비에 접속할 수 있으므로 관리자 계정 추가
use admin
db.createUser ~~ 아까랑 같아
ctl c로 종료하고 몽고디비가 인증을 사용하도록 설정
sudo systemctl stop mongod
vim /etc/mongod.conf
다음 두줄을 추가. a를 눌러 입력보드 전환. esc눌러 명령어 모드로 전환. :wq!로 저장
security:
authorization: enabled
다시 mongod를 실행하고 mongo admin -u 이름 -p 비밀번호로 접속
sudo systemctl start mongod
mongo admin -u 이름 -p 비밀번호
데이터베이스 및 컬렉션 생성하기
데이터베이스 만들기 : use [데이터베이스명]
목록 확인 : show dbs
(데이터가 한 개 이상 있어야 목록에 표시돼)
현재 사용 중인 데이터베이스를 확인 : db
생성 db.createCollection('~~')
생성한 컬렉션 목록 : show collections
컬렉션은 MYSQL의 테이블에 대응.
CRUD 작업하기
CREATE
Date나 정규표현식 같은 자바스크립트 객체를 자료형으로 사용할 수 있고, Binary Data, ObjectId, Int, Long, Decimal, Timestamp, Javascript 등의 추가적인 자료형이 있다. ObjectId, Binar Data, Timestamp 외에는 잘 사용안돼
db.컬렉션명.save(다큐먼트)로 다큐먼트를 생성
> db.users.save({name:'zero',age:24,married:false,comment:'안녕하세요. 간단히 몽고디비 사용 방법에 대해 알아봅시다.',createdAt:new Date()});
WriteResult({ "nInserted" : 1 })
> db.users.save({name:'nero',age:32,married:true,comment:'안녕하세요. zero 친구 nero입니다.',createdAt:new Date()});
WriteResult({ "nInserted" : 1 })
> db.comments.save({commenter:ObjectId('603500a1e24e73ddb2f3c92b'),comment:'안녕하세요. zero의 댓글입니다.',createdAt:new Date()});
WriteResult({ "nInserted" : 1 })
READ
find({}) : 컬렉션 내의 모든 다큐먼트를 조회하라는 뜻
특정 필드만 조회하고 싶다면 두번째 인수로 조회할 필드. 1또는 true로 표시한 필드만 가져온다.
_id는 기본적으로 가져오게 되어 있으므로 0또는 false를 입력했음
조회 시 조건을 주려면 첫번째 인수 객체에 기입.
시퀄라이즈 쿼리와 비슷
$gt(초과), $gte(이상), $lt(미만), $lte(이하), $ne(같지 않음), $or(또는), $in(배열 요소 중 하나)
sort : -1은 내림차순, 1은 오름차순
limit : 조회할 개수
skip : 건너뒬지
> db.users.find({});
{ "_id" : ObjectId("603500a1e24e73ddb2f3c92b"), "name" : "zero", "age" : 24, "married" : false, "comment" : "안녕하세요. 간단히 몽고디비 사용 방법에 대해 알아봅시다.", "createdAt" : ISODate("2021-02-23T13:18:25.462Z") }
{ "_id" : ObjectId("603500fde24e73ddb2f3c92c"), "name" : "nero", "age" : 32, "married" : true, "comment" : "안녕하세요. zero 친구 nero입니다.", "createdAt" : ISODate("2021-02-23T13:19:57.786Z") }
> db.comments.find({});
{ "_id" : ObjectId("603504dbe24e73ddb2f3c92d"), "commenter" : ObjectId("603500a1e24e73ddb2f3c92b"), "comment" : "안녕하 세요. zero의 댓글입니다.", "createdAt" : ISODate("2021-02-23T13:36:27.971Z") }
> db.users.find({age:{$gt:30},married:true},{_id:0,name:1,age:1});
{ "name" : "nero", "age" : 32 }
> db.users.find({$or:[{age:{$gt:30}},{married:false}]},{_id:0,name:1,age:1});
{ "name" : "zero", "age" : 24 }
{ "name" : "nero", "age" : 32 }
> db.users.find({},{_id:0,name:1,age:1}).sort({age:-1}).limit(1).skip(1)
{ "name" : "zero", "age" : 24 }
UPDATE
첫번째 객체는 수정할 다큐먼트를 저장하는 객체
두번째 객체는 수정할 내용을 입력하는 객체
$set : 어떤 필드를 수정할지 정하는 연산자. 이 연산자를 사용하지 않으면 통째로 바뀐다.
> db.users.update({name:'nero'},{$set:{comment:'안녕하세요. 이 필드를 바꿔보겠습니다!'}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
DELETE
> db.users.remove({name:'nero'})
WriteResult({ "nRemoved" : 1 })
몽구스 사용하기
몽구스는 시퀄라이즈와 달리 ODM(Object Document Mapping)이라고 불린다. 몽고디비는 릴레이션이 아니라 다큐먼트를 사용하므로 ORM이 아니라 ODM이다.
장점이 뭘까
1. 스키마가 생김
2. JOIN기능을 populate 메서드로 어느 정도 보완함
npm i express morgan nunjucks mongoose
npm i -D nodemon
schema/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;
1. 개발 환경일 때만 콘솔을 통해 몽구스가 생성하는 쿼리 내용을 확인할 수 있게 하는 코드
2. 몽구스와 몽고디비를 연결하는 부분. 접속 시도하는 데이터베이스는 admin이지만, 실제로 사용할 데이터베이스는 nodejs이므로 두번째 인수로 dbName 옵션을 줘서 nodejs 데이터베이스를 사용하게 했다.
3. 몽구스 커넥션에 이벤트 리스너를 달아두었다. 에러 발생 시 에러 내용을 기록하고, 연결 종료 시 재연결을 시도
스키마 정의
몽구스 스키마에서 특이한 점은 String, Number, Date, Buffer, Boolean, Mixed, ObjectId, Array를 값으로 가질 수 있다는 점이다. 몽고디비의 자료형과 조금 다르며, 편의를 위해 종류 수를 주여두었다.
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,
createdAt: {
type: Date,
default: Date.now,
},
});
module.exports = mongoose.model('User', userSchema);
type을 ObjectId 하는거, ref:'User
이걸로 JOIN 비스무리하게 할꺼야
const mongoose = require('mongoose');
const { Schema } = mongoose;
const {
Types: { ObjectId },
} = Schema;
const commentSchema = new Schema({
commenter: {
type: ObjectId,
required: true,
ref: 'User',
},
comment: {
type: String,
required: true,
},
createdAt: {
type: Date,
default: Date.now,
},
});
module.exports = mongoose.model('Comment', commentSchema);
create
const user = await User.create({
name: req.body.name,
age: req.body.age,
married: req.body.married,
});
read
const users = await User.find({});
const comments = await Comment.find({ commenter: req.params.id })
.populate('commenter');
update
const result = await Comment.update({
_id: req.params.id,
}, {
comment: req.body.comment,
});
delte
const result = await Comment.remove({ _id: req.params.id });
나머지는 책코드참조
'책 > nodejs 교과서' 카테고리의 다른 글
10. API 서버 이해하기 (0) | 2021.02.27 |
---|---|
9. 익스프레스로 SNS 서비스 만들기 (1) | 2021.02.25 |
7. MYSQL (0) | 2021.02.22 |
6. 익스프레스 웹 서버 만들기 (0) | 2021.02.21 |
5. 패키지 매니저 (0) | 2021.02.20 |