MongoDB 시작하기


MongoDB는 document 기반의 오픈소스 NOSQL 데이터베이스로 쿼리가 자바스크립트 문법과 거의 동일해 자바스크립트 진영에서 인기가 높은 데이터베이스입니다.

설치

일반적인 경우(로컬에서 데이터베이스를 사용하는 경우) 공식 매뉴얼에 따라 본인의 환경에 맞게 커뮤니티 에디션 버전을 설치해주면 됩니다. 함께 MongoDB Compass라는 GUI 애플리케이션이 설치됩니다.

데이터베이스를 클라우드에서 사용하고 싶은 경우 MongoDB Atlas를 사용할 수 있습니다.

특징

Document기반 데이터베이스시스템으로 BSON(Binary JSON)이라는 JSON과 유사한 포맷의 document에 데이터를 저장합니다. 이 document는 SQL의 table과 유사한 컬렉션(collections)에 저장됩니다.

컬렉션은 RDBMS의 table과 유사하지만 RDBMS와는 달리 Schema를 사전에 정의해 줄 필요가 없어 초기 작업량을 대폭 줄여줍니다.

_id 필드

MongoDB의 모든 document에는 _id 필드가 존재합니다. 이 필드는 SQL의 primary key와 유사하게 고유한 값을 가져야 합니다. 만약 사용자가 document를 생성할 때 _id를 지정하지 않으면 MongoDB는 자동으로 ObjectId타입의 고유한 _id 필드를 생성합니다.

CRUD 연산

아래 글은 모두 MongoDB를 Shell에서 사용할 때의 Query입니다. 만약 다른 언어에서 MongoDB를 사용한다면 공식 문서에서 찾아볼 수 있습니다.

CRUD 연산은 전부 db.<컬렉션 이름>.<operation>형태를 띕니다. 만약 <컬렉션 이름>이 존재하지 않는다면 MongoDB는 해당 컬렉션을 생성합니다.

Create

한 개의 document를 생성하기위해서는 insertOne함수를 사용합니다.

db.posts.insertOne({ title: 'MongoDB' });

만약 한 번에 여러 document들을 생성해야 하면 insertMany 함수를 사용합니다. 이 때 함수에 넘겨주는 매개변수는 document들의 array입니다.

db.post.insertMany([{ title: 'MongoDB' }, { title: 'Mongoose' }]);

만약 insert하는 오브젝트에 _id필드가 없으면 자동으로 ObjectId가 document에 추가됩니다.

Read (Select)

collection의 document를 읽어오기 위해서는 find함수를 사용합니다.

db.post.find({});

위 쿼리는 post collection의 모든 document를 읽어옵니다. 특정 조건을 만족하는 document를 읽어오기 위해서는 매개변수로 넘겨주는 object에 해당 조건을 추가해주면 됩니다.

db.post.find({ title: 'MongoDB' });

위 쿼리는 post의 document들 중 title필드가 "MongoDB"인 document들을 읽어옵니다.

이 외에 $로 시작하는 연산자들을 이용하면 find 함수에 여러가지 조건을 적용할 수 있습니다.

// post의 document중 views필드가 10 이상인 것들만 읽어 옵니다.
// gte는 greater than or equal의 약자입니다.
db.post.find({ views: { $gte: 10 } });

// author이 cloudless, 그리고 views가 10 이상인 document를 읽어 옵니다.
db.post.find({
    author: 'cloudless',
    views: { $gte: 10 }
});

// author이 cloudless, 또는 views가 10 이상인 document를 읽어 옵니다.
db.post.find({ $or: [(author: 'cloudless'), (views: { $gte: 10 })] });

위 경우보다 훨씬 다양한 종류의 쿼리 연산자들은 공식 문서의 해당 항목에서 찾아볼 수 있습니다.

Update

Document를 수정하기 위해서는 updateOne 또는 updateMany함수를 사용합니다.

두 함수는 매개변수로 <filter>, <document>, <options>을 받습니다. 세번째 매개변수는 옵션입니다.

db.post.updateOne(
    { title: 'MongoDB' },
    { $set: { title: 'MySQL' } }
);

위 쿼리는 title이 MongoDB인 document 1개의 title을 MySQL로 바꿔줍니다.

updateOne대신 updateMany를 사용하면 조건을 만족하는 모든 document를 수정합니다.

세번째 옵션의 upsert(update + insert)필드를 참으로 설정하면 조건을 만족하는 document가 존재하지 않을 때 새로운 document를 생성합니다.

db.post.updateOne(
    { title: 'MongoDB' },
    { $set: { title: 'MySQL' } },
    { upsert: true }
);

위 쿼리는 MongoDB라는 title이 없을 때 MySQL이라는 title을 가진 document를 생성합니다.

Delete

Document를 삭제하기 위해서는 deleteMany함수를 사용합니다. 사용법은 find()와 거의 동일합니다.

db.post.delete({ title: 'MongoDB' });

위 쿼리는 title이 MongoDB인 모든 document를 삭제합니다.

만약 조건에 일치하는 document 한 개만 삭제하고 싶다면 deleteOne함수를 사용하면 됩니다.