CRUD 작업하기
Create(생성)
컬렉션에 컬럼을 정의하지 않아도 되므로 컬렉션에는 아무 데이터나 넣을 수 있습니다. 이러한 자유로움이 몽고디비의 장점입니다. 단, 무엇이 들어올지 모른다는 단점도 있습니다.
몽고디비의 자료형은 MySQL과 조금 다릅니다. 여기서 몽고디비의 자료형을 알아봅시다. 기본적으로 몽고디비는 자바스크립트 문법을 사용하므로 자바스크립트의 자료형을 따릅니다. 하지만 추가로 몇 가지 자료형이 더 있습니다.
Date나 정규표현식 같은 자바스크립트 객체를 자료형으로 사용할 수 있습니다.
Binary Data, ObjectId, Int, Long, Decimal, Timestamp, JavaScript 등의 추가적인 자료형이 있습니다. Undefined와 Symbol은 몽고디비에서 자료형으로 사용하지 않습니다. 추가적인 자료형 중에서 ObjectId와 Binary Data, Timestamp 외에는 잘 사용되지 않습니다. ObjectId는 MySQL에서 기본 키로 쓰이는 값과 비슷한 역할을 한다고 생각하면 됩니다. 고유한 값을 가지므로 다큐먼트를 조회할 때 사용할 수 있습니다.
몽고디비 프롬프트를 실행하여 다음 명령어를 입력합니다. 먼저 nodejs 데이터베이스를 사용한다는 것을 알립니다.
$ mongosh
> use nodejs;
switched to db nodejs
> db.users.insertOne({ name: 'zero', age: 24, married: false, comment: '안녕하세요. 간단히 몽고디비 사용 방법에 대해 알아봅시다.', createdAt: new Date() });
{
acknowledged: true,
insertedId: ObjectId('68ce0bdac7b7036f3cfc0c98')
}
> db.users.insertOne({ name: 'nero', age: 32, married: true, comment: '안녕하세요. zero 친구 nero입니다.', createdAt: new Date() });
{
acknowledged: true,
insertedId: ObjectId('68ce0be5c7b7036f3cfc0c99')
}
db.컬렉션명.insertOne(다큐먼트)로 다큐먼트를 생성할 수 있습니다. 자바스크립트 객체처럼 생성하면 됩니다. new Date()는 현재 시간을 입력하라는 뜻입니다. 명령이 성공적으로 수행되었다면 acknowledged: true와 insertedId: ObjectId("5a1687007af03c3700826f70")이라는 응답이 옵니다. 이 문자는 사용자마다 다릅니다. 이 오브젝트 아이디가 검색할 때 쓰이는 키입니다. 실패했다면 에러 내용이 응답으로 옵니다.
comments 컬렉션에도 데이터를 넣어봅시다. zero의 댓글을 넣을 것이므로 zero의 아이디를 알아야 합니다.
> db.users.find({ name: 'zero' }, { _id: 1 })
{
_id: ObjectId('68ce0bdac7b7036f3cfc0c98')
}
zero의 아이디가 ObjectId("68ce0bdac7b7036f3cfc0c98")이라고 나왔습니다. 다음 명령어를 입력할 때 책의 문자열을 그대로 입력하지 말고, 여러분의 결과에 나온 문자열을 입력하세요.
> db.comments.insertOne({ commenter: ObjectId('68ce0bdac7b7036f3cfc0c98'), comment: '안녕하세요. zero의 댓글입니다.', createdAt: new Date() }
{
acknowledged: true,
insertedId: ObjectId('68ce0eac2d57c4ab504257fc')
}
Read(조회)
조금 전에 생성한 다큐먼트들을 조회해보겠습니다.
$ mongosh
nodejs> db.users.find({});
[
{
_id: ObjectId('68ce0bdac7b7036f3cfc0c98'),
name: 'zero',
age: 24,
married: false,
comment: '안녕하세요. 간단히 몽고디비 사용 방법에 대해 알아봅시다.',
createdAt: ISODate('2025-09-20T02:05:14.161Z')
},
{
_id: ObjectId('68ce0be5c7b7036f3cfc0c99'),
name: 'nero',
age: 32,
married: true,
comment: '안녕하세요. zero 친구 nero입니다.',
createdAt: ISODate('2025-09-20T02:05:25.605Z')
}
]
find({})는 컬렉션 내의 모든 다큐먼트를 조회하라는 뜻입니다.
특정 필드만 조회하고 싶다면 다음과 같이 하면 됩니다. name과 married 필드만 가져오겠습니다.
$ mongosh
nodejs> db.users.find({}, { _id: 0, name: 1, married: 1 });
[ { name: 'zero', married: false }, { name: 'nero', married: true } ]
find 메서드의 두 번째 인수로 조회할 필드를 넣었습니다. 1 또는 true로 표시한 필드만 가져옵니다. _id는 기본적으로 가져오게 되어 있으므로 0 또는 false를 입력해 가져오지 않도록 해야 합니다.
조회 시 조건을 주려면 첫 번째 인수 객체에 기입하면 됩니다. age가 30 초과, married가 true인 다큐먼트의 이름과 나이를 조회해보겠습니다.
nodejs> db.users.find({ age: { $gt: 30 }, married: true }, { _id: 0, name: 1, age: 1 });
[ { name: 'nero', age: 32 } ]
$gt라는 특수한 속성을 사용했습니다. 이는 시퀄라이즈의 쿼리와 비슷합니다. 몽고디비는 자바스크립트 객체를 사용해서 명령어 쿼리를 생성해야 하므로 $gt 같은 특수한 연산자가 사용됩니다.
자주 쓰이는 연산자로는 $gt(초과), $gte(이상), $lt(미만), $lte(이하), $ne(같지 않음), $or(또는), $in(배열 요소 중 하나) 등이 있습니다.
몽고디비에서 OR 연산은 $or를 사용합니다. age가 30 초과이거나 married가 false인 다큐먼트를 조회해보겠습니다. $or에 주어진 배열 안의 조건들을 하나라도 만족하는 다큐먼트를 모두 찾습니다.
nodejs> db.users.find({ $or: [{ age: { $gt: 30 } }, { married: false }] }, { _id: 0, name: 1, age: 1 });
[ { name: 'zero', age: 24 }, { name: 'nero', age: 32 } ]
정렬도 가능합니다. sort 메서드를 사용하면 됩니다. 나이가 많은 순서대로 정렬해보겠습니다. -1 은 내림차순, 1은 오름차순이므로 -1을 사용합니다.
nodejs> db.users.find({}, { _id: 0, name: 1, age: 1 }).sort({ age: -1 })
[ { name: 'nero', age: 32 }, { name: 'zero', age: 24 } ]
조회할 다큐먼트 개수를 설정할 수도 있습니다. limit 메서드를 사용합니다.
nodejs> db.users.find({}, { _id: 0, name: 1, age: 1 }).sort({ age: -1 }).limit(1)
[ { "name" : "nero", "age" : 32 } ]
다큐먼트 개수를 설정하면서 몇 개를 건너뛸지 설정할 수도 있습니다. skip 메서드를 사용합니다.
nodejs> db.users.find({}, { _id: 0, name: 1, age: 1 }).sort({ age: -1 }).limit(1).skip(1)
[ { "name" : "zero", "age" : 24 } ]
Update(수정)
이번에는 기존 데이터를 수정해보겠습니다. 몽고디비 프롬프트에 다음 명령어를 입력합니다.
nodejs> db.users.updateOne({ name: 'nero' }, { $set: { comment: '안녕하세요 이 필드를 바꿔보겠습니다!' } });
{
acknowledged: true,
insertedId: null,
matchedCount: 1,
modifiedCount: 1,
upsertedCount: 0
}
첫 번째 객체는 수정할 다큐먼트를 지정하는 객체이고, 두 번째 객체는 수정할 내용을 입력하는 객체입니다. $set이라는 연산자가 사용되었는데요. 이 연산자는 어떤 필드를 수정할지 정하는 연산자입니다. 만약 이 연산자를 사용하지 않고 일반 객체를 넣는다면, 다큐먼트가 통째로 두 번째 인수로 주어진 객체로 수정되고 맙니다. 따라서 일부 필드만 수정하고 싶을 때는 반드시 $set 연산자를 지정해야 합니다.
수정에 성공했다면, 첫 번째 객체에 해당하는 다큐먼트 수(matchedCount)와 수정된 다큐먼트 수(modifiedCount)가 나옵니다.
Delete(삭제)
이번에는 데이터를 삭제해보겠습니다. 몽고디비 프롬프트에 다음 명령어를 입력합니다.
nodejs> db.users.deleteOne({ name: 'nero' })
{ acknowledged: true, deletedCount: 1 }
삭제할 다큐먼트에 대한 정보가 담긴 객체를 첫 번째 인수로 제공하면 됩니다. 성공 시 삭제된 개수(deletedCount)가 반환됩니다.