본문 바로가기

Database/NoSQL - mongoDB

mongoDB - CRUD 명령어 (CRUD Commands)

몽고디비의 자료형은 MySQL과는 조금 다르다. 몽고디비는 기본적으로 자바스크립트 문법을 사용하므로 자바스크립트의 자료형들을 따른다. 하지만 추가로 몇 가지 자료형이 더 있다.

 

Date나 정규 표현식 같은 자바스크립트 객체를 자료형으로 사용할 수 있고, Binary Data, ObjectId, Int, Long, Decimal, Timestamp, JavaScript 등의 추가적인 자료형이 있다. UndefinedSymbol은 몽고디비에서 자료형으로 사용하지 않는다. 추가적인 자료형 중 ObjectId와 Binary Data, Timestamp 외의 다른 것들은 잘 사용하지 않는다. ObejctId는 MySQL에서 기본 키로 쓰이는 값과 비슷한 역할을 한다고 생각하면 된다. 고유한 값을 가지므로 도큐멘트를 조회할 때 사용할 수 있다.

 

Create (생성)

컬렉션에 컬럼을 정의하지 않아도 되므로 컬렉션에는 아무 데이터나 넣을 수 있다. 그러나 무엇이 들어올지 모른다는 단점은 있다.

 

도큐멘트 생성은 db.컬렉션.save(도큐멘트) 명령어로 할 수 있다. new Date() 는 현재 시간을 입력하라는 뜻이다. 명령이 성공적으로 수행되었다면 writeResult({ "nInserted" : 1 }) 이라는 응답이 온다. 도큐멘트 하나가 생성되었다는 뜻이다. 실패했다면 에러 내용이 응답으로 온다.

 

> use nodejs
switched to db nodejs
> db.users.save({ name: 'beom', age: 23, married: false, comment: 'hello world!', createdAt: new Date() });
WriteResult({ "nInserted" : 1 })
> db.users.save({ name: 'seok', age: 46, married: true, comment: 'hello world...', createdAt: new Date() });
WriteResult({ "nInserted" : 1 })

 

comments 컬렉션에도 데이터를 넣어보자. beom의 댓글을 넣을 것이므로 beom의 아이디를 알아내야한다. 이후에 다룰 Read 기능을 미리 한번 사용하여 id를 알아내보자.

 

> db.users.find({ name: 'beom' }, { _id: 1 })
{ "_id" : ObjectId("5f34dc5dd194c7c40f63a8ae") }

 

위와 같이 ObjectId 값이 뜬다. 이 문자열은 사용자마다 다르다. 이제 코멘트를 하나 달아보자.

 

> db.comments.save({ commenter: ObjectId('5f34dc5dd194c7c40f63a8ae'), comment: '안녕하세요. 범입니다.', createdAt: new Date() });
WriteResult({ "nInserted" : 1 })

 

Read (조회)

조금 전에 생성한 도큐멘트들을 조회해보자. find({}) 는 컬렉션 내의 모든 도큐멘트를 조회한다.

 

> db.users.find({})
{ "_id" : ObjectId("5f34dc5dd194c7c40f63a8ae"), "name" : "beom", "age" : 23, "married" : false, "comment" : "hello world!", "createdAt" : ISODate("2020-08-13T06:23:25.333Z") }
{ "_id" : ObjectId("5f34dc78d194c7c40f63a8af"), "name" : "seok", "age" : 46, "married" : true, "comment" : "hello world...", "createdAt" : ISODate("2020-08-13T06:23:52.156Z") }

 

특정 필드만을 조회할 수도 있다. find 메서드의 두 번째 인수에 조회할 필드를 넣어주면 된다. 1 또는 true로 표시된 필드만 가져오며, _id는 기본적으로 가져오게 돼 있으므로 0 또는 false를 입력해야 가져오지 않는다.

 

> db.users.find({}, { _id: 0, name: 1, married: 1 })
{ "name" : "beom", "married" : false }
{ "name" : "seok", "married" : true }

 

조건부 조회

조회할 때 조건을 추가하려면 첫 번째 인수 객체에 기입한다. age가 30 초과, married가 true인 도큐멘트의 이름과 나이를 조회해보자.

 

> db.users.find({ age: { $gt: 30 }, married: true }, { _id: 0, name: 1, married: 1 })
{ "name" : "seok", "married" : true }

 

MySQL과 비슷한 방식으로 조건부를 넣는다. 다만 앞에 $ (달러사인) 이 붙는다.

 

자주 쓰이는 연산자로는 $gt (greater than, 초과), $gte (greater than or equal to, 이상), $lt (less than, 미만), $lte (less than or equal to, 이하), $ne (not equal, 같이 않음), $or (or, 또는), $in (in, 배열 요소 중 하나) 등이 있다.

 

몽고디비에서 OR 연산자는 다음과 같이 사용한다. 배열 안에 조건들을 넣고, 몽고디비는 배열 내의 조건을 하나라도 만족하는 도큐멘트를 모두 찾는다.

 

> db.users.find({ $or: [{ age: { $gt: 30 } }, { married: false }] }, { _id: 0, name: 1, age: 1 });
{ "name" : "beom", "age" : 23 }
{ "name" : "seok", "age" : 46 }

 

sort, 정렬

정렬은 sort 메서드를 사용한다. -1은 내림차순, 1은 오름차순이다.

 

> db.users.find({}, { _id: 0, name: 1, age: 1 }).sort({ age: -1 })
{ "name" : "seok", "age" : 46 }
{ "name" : "beom", "age" : 23 }

 

limit, 제한

조회할 도큐멘트 개수를 설정할 수도 있다. limit(n) 메서드를 사용한다.

 

> db.users.find({}, { _id: 0, name: 1, age: 1 }).sort({ age: -1 }).limit(1)
{ "name" : "seok", "age" : 46 }
> db.users.find({}, { _id: 0, name: 1, age: 1 }).limit(1)
{ "name" : "beom", "age" : 23 }

 

skip, 건너 뛰기

조회할 도큐멘트를 몇 개 건너뛸지 설정할 수도 있다. skip(n) 메서드를 사용한다.

 

> db.users.find({}, { _id: 0, name: 1, age: 1 }).skip(1)
{ "name" : "seok", "age" : 46 }
> db.users.find({}, { _id: 0, name: 1, age: 1 }).limit(1).skip(1)
{ "name" : "seok", "age" : 46 }

 

이 외에도 여러 쿼리가 있다. 더 보고 싶다면 아래 포스트를 참고한다.

 

https://velopert.com/479

 

[MongoDB] 강좌 3편 Document Query(조회) – find() 메소드 | VELOPERT.LOG

이번 강좌에선 Document를 조회하는 메소드인 find() 메소드를 자세히 알아보도록 하겠습니다. Document 조회: db.COLLECTION_NAME.find(query, projection) 이 메소드에서 사용되는 매개변수에 대하여 알아봅시다

velopert.com

 

Update (수정)

기존 데이터를 수정해보자. 수정하는 명령어는 db.컬렉션.update({ 조건 }, { $set: { 내용 } }) 이다. $set을 붙이면 지정한 필드만 수정이 된다. 만약 $set을 붙이지 않고 일반 객체를 넣는다면 도큐멘트가 통째로 두 번째 인수에 주어진 객체로 수정된다.

 

> db.users.update({ name: 'beom' }, { $set: { comment: 'hello my name is beom.' } });
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

 

응답으로 돌아오는 nMatched 는 첫 번째 객체 (조건) 에 해당하는 도큐멘트의 수이고, nModified 는 수정된 도큐멘트 수이다.

 

Delete (삭제)

데이터 삭제는 db.컬렉션.remove({ 조건 }) 쿼리로 한다.

 

> db.users.remove({ name: 'beom' });
WriteResult({ "nRemoved" : 1 })

 

응답으로 nRemoved (삭제된 도큐멘트 수) 가 돌아온다.

 

 

출처

Node.js 교과서 개정 2판 - 길벗, 조현영

https://velopert.com/479