본문 바로가기

Database/MongoDB

mongoose를 이용한 MongoDB CRUD 방법

1. collection을 만들고 document를 생성하는 방법

 

(collection은 관계형 데이터의 table과 같고 document는 row와 같다.)

 

const mongoose = require('mongoose');

 

mongoose.connect('mongodb://localhost/database') // 이름을 정해줄 수 있다.

    .then(() => console.log('몽고디비가 연결됐습니다.'))

    .catch((error) => console.log('몽고디비 연결에 실패했습니다.', error));

 

const schema = new mongoose.Schema({ // 데이터 타입

    name: String,

    level: Number,

    hobby: [ String ],

    date: { type: Date, default: Date.now }, // 날짜를 알아서 생성해준다.

    isCashed: Boolean

});

 

// 클래스를 정의한다.

const Users = mongoose.model('Users', schema);

 

async function createUsers() {

    // 인스턴스를 만들고

    const users = new Users({

        name: 'socratone',

        level: 1,

        hobby: ['javascript', 'english'],

        isCashed: true

    });

    // 저장한다.

    const result = await users.save();

    console.log(result);

}

createUsers();

 

 

2. 저장된 데이터를 필터링해서 불러오는 방법

 

async function getUsers() {

    const users = await Users

        .find({ name: 'socratone', isCashed: true })

        .limit(10)

        .sort({ name: 1 })

        .select({ name: 1, hobby: 1 });

    console.log(users);

}

getUsers();

 

 

3. 비교 연산자를 이용해서 불러오는 방법

 

위의 예제에서 find 부분을 바꿔준다면

 

// 1 <= level <= 10 사이의 데이터를 불러온다.

.find({ level: { $gte: 1, $lte: 10 } })

 

// level이 1, 5, 10인 데이터를 불러온다.

.find({ level: { $in: [1, 5, 10] } })

 

그밖에도 쓸 수 있는 연산자는 다음과 같다.

 

eq // equal

ne // not equal

gt // greater than

gte // greater than or equal

lt // less than

lte // less than or equal

in

nin // not in

 

 

4. and와 or를 이용해서 불러오는 방법

 

// find 뒤에 or를 넣어서 두 가지 경우 중 하나라도 해당되는 데이터를 모두 가져온다.

.find()

.or([ { name: 'socratone' }, { isCashed: true } ])

 

// and를 넣어서 두 가지 경우에 해당하는 데이터를 모두 가져온다.

.find()

.and([ { name: 'socratone' }, { isCashed: true } ])

 

 

5. 정규식을 이용해서 불러오는 방법

 

// socratone이라는 글자로 시작하는 경우

.find({ name: /^socratone/ })

 

// socratone이라는 글자로 끝나는 경우

.find({ name: /socratone$/ })

 

// socratone이라는 글자를 포함하는 경우

.find({ name: /.*socratone.*/ })

 

// 제일 끝에 i를 붙이면 대소문자를 구별하지 않는다.

.find({ name: /.*socratone.*/i })

 

 

6. 데이터의 개수를 확인하는 방법

 

// select대신 count()를 쓴다.

// .select({ name: 1, hobby: 1 });

.count();

 

 

7. 페이지 구현

 

다음의 skip과 limit으로 페이지에 해당하는 부분만 보여줄 수 있다.

 

.skip((pageNumber - 1) * pageSize)

.limit(pageSize)

 

 

8. 업데이트 1 - querry first

데이터를 찾아서 새로 저장해 업데이트하는 방법

 

async function updateUsers(id) {

    const users = await Users.findById(id);

    if (!users) return;

 

    users.isCashed = true;

    users.name = 'soc';

 

    const result = await users.save();

    console.log(result);

}

 

 

9. 업데이트 2 - update first

 

데이터를 바로 업데이트 하는 방법

 

async function updateUsers(id) {

    const users = await Users.findByIdAndUpdate(id, { // 값을 받을 필요가 없으면 update 메소드를 써도 된다.

        $set: { // set 이외의 operator는 아래 링크를 참고

            name: 'soc',

            isCashed: true

        }

    }, { new: true }); // new에 true를 설정해주면 이전의 값이 아닌 바뀐 값을 users에 담는다.

    console.log(users);

}

 

참고 : https://docs.mongodb.com/manual/reference/operator/update/

 

 

10. 삭제

 

async function removeUsers(id) {

    const result = await Users.deleteOne({ _id: id }); // 여러개를 지우려면 deleteMany 메소드를 쓴다.

}