본문 바로가기
DataBase/mongoDB

mongoDB) CRUD 작업하기

by 박채니 2023. 6. 28.
안녕하세요, 코린이의 코딩 학습기 채니 입니다.
[Node.js 교과서]의 책을 참고하여 포스팅한 개인 공부 내용입니다.

 

아래 게시글에 이어서 작성하였습니다. 

https://chanychu.tistory.com/504

 

mongoDB) 데이터베이스와 컬렉션 생성하기

안녕하세요, 코린이의 코딩 학습기 채니 입니다. [Node.js 교과서]의 책을 참고하여 포스팅한 개인 공부 내용입니다. mongoDB Compass로 Connection 생성하기 mongoDB Compass에 접속하여 New Connection을 눌러줍

chanychu.tistory.com

 

Create

 

  • 하나의 document를 생성할 때 → insertOne 사용
  • 여러 개의 document를 생성할 때 → insertMany 사용

⚠️ save 명령어도 있었지만, 현재는 사용하지 않음! (몽구스에는 존재)

 

insertOne을 이용하여 document를 생성하였습니다.

nodejs> db.users.insertOne({ name: 'chany', age: 25, married: false, comment: '안녕하세요. 몽고디비 배워봅시당', createdAt: new Date() })
{
  acknowledged: true,
  insertedId: ObjectId("649ae1fcdac0a9124246d194")
}
nodejs> db.users.insertOne({ name: 'strongmin', age: 30, married: false, comment: '안녕하세요. chany친구입니다.', createdAt: new Date() })
{
  acknowledged: true,
  insertedId: ObjectId("649ae224dac0a9124246d195")
}

오타 검사가 별도 없기 때문에, document 생성에 주의해야 합니다.

createdAt과 같은 날짜 형식new Date()를 이용하여 생성합니다.

또한, 생성된 document마다 ObjectId가 생성된 것을 확인할 수 있으며, primary key 역할을 하게 됩니다.

 

아래와 같이 생성된 ObjectId를 이용하여 컬렉션 간 관계를 맺을 수 있습니다.

nodejs> db.comments.insertOne({ commenter: ObjectId("649ae1fcdac0a9124246d194"), comment: '안녕하세요, chany의 댓글입니다.', createdAt: new Date() })
{
  acknowledged: true,
  insertedId: ObjectId("649ae3c7f1ae4322314cbaed")
}

단, mySQL과는 달리 foreign key 실제로 존재하는지 검사해주지 않기 때문에, ObjectId로 관계 설정을 할 때 오타를 조심해야 합니다.

 

Read

 

  • 하나의 document를 조회할 때 → findOne 사용
  • 여러 개의 document를 조회할 때 → find 사용

 

nodejs> db.users.find({ name: 'chany' })
[
  {
    _id: ObjectId("649ae1fcdac0a9124246d194"),
    name: 'chany',
    age: 25,
    married: false,
    comment: '안녕하세요. 몽고디비 배워봅시당',
    createdAt: ISODate("2023-06-27T13:19:56.938Z")
  }
]

'chany'라는 이름을 가진 데이터들을 가져오는 것을 확인할 수 있습니다.

ObjectId 내의 생성된 날짜 형식을 내부적으로 가지고 있기 때문에, 해당 id를 통해 최신순 혹은 오래된 순으로 정렬이 가능합니다.

 

nodejs> db.users.find()
[
  {
    _id: ObjectId("649ae1fcdac0a9124246d194"),
    name: 'chany',
    age: 25,
    married: false,
    comment: '안녕하세요. 몽고디비 배워봅시당',
    createdAt: ISODate("2023-06-27T13:19:56.938Z")
  },
  {
    _id: ObjectId("649ae224dac0a9124246d195"),
    name: 'strongmin',
    age: 30,
    married: false,
    comment: '안녕하세요. chany친구입니다.',
    createdAt: ISODate("2023-06-27T13:20:36.696Z")
  }
]

실제로 조건 없이 모든 users를 조회해보면, 오름차순 정렬이 되어 출력되는 것을 확인할 수 있습니다.

 

두 번째 인수로 조회할 필드 선택 (1은 추가, 0은 제외)

nodejs> db.users.find({}, { _id: 0, name: 1, married: 1 })
[
  { name: 'chany', married: false },
  { name: 'strongmin', married: false }
]

모든 users를 조회하되, name과 married 필드만 조회된 것을 확인할 수 있습니다.

_id는 기본적으로 1이기 때문에 명시적으로 제외해준다고 해야 합니다.

 

첫 번째 인수로 조회 조건 입력 가능

  • $gt$or 같은 조건 연산자 사용
nodejs> db.users.find({ age: { $gt: 25 }, married: false }, { _id: 0, name: 1, married: 1, age: 1 })
[ { name: 'strongmin', age: 30, married: false } ]

nodejs> db.users.find({ $or: [{ age: { $gt: 30 } }, { married: false }] }, { _id: 0, name: 1, age: 1 })
[ { name: 'chany', age: 25 }, { name: 'strongmin', age: 30 } ]

 

정렬

nodejs> db.users.find({}, { _id: 0, name: 1, age: 1 }).sort({ age: -1 })
[ { name: 'strongmin', age: 30 }, { name: 'chany', age: 25 } ]

mySQL에서는 ASC가 오름차순, DESC가 내림차순이였지만, mongoDB에서는 1이 오름차순, -1이 내림차순입니다.

 

조회할 document 개수 제한 (limit 메소드)

nodejs> db.users.find({}, { _id: 0, name: 1, age: 1 }).sort({ age: -1 }).limit(1)
[ { name: 'strongmin', age: 30 } ]

내림차순으로 정렬 후 1개의 document만 조회하였습니다.

 

건너뛸 document 개수 제공 (skip 메소드)

nodejs> db.users.find({}, { _id: 0, name: 1, age: 1 }).sort({ age: -1 }).limit(1).skip(1)
[ { name: 'chany', age: 25 } ]

mySQL의 offset과 동일한 역할을 합니다. 1개의 document를 건너뛴 것을 확인할 수 있습니다.

 

Update

 

  • 하나의 document를 변경할 때 → updateOne 사용
  • 여러 개의 document를 변경할 때 → updateMany 사용
  • 첫 번째 인수로 수정 대상, 두 번째 인수로 수정 내용 제공
  • $set을 붙이지 않으면 document 전체가 update 되므로 주의

 

nodejs> db.users.updateOne({ name: 'chany' }, { $set: { comment: '변경 시 꼭꼭 set을 붙여야됩니다!' }})
{
  acknowledged: true,
  insertedId: null,
  matchedCount: 1,
  modifiedCount: 1,
  upsertedCount: 0
}

성공적으로 변경 시 변경된 수를 보여줍니다.

 

⚠️ 아래와 같이 update하면 안됨!

nodejs> db.users.updateOne({ name: 'chany' }, { comment: '변경 시 꼭꼭 set을 붙여야됩니다!' })

이렇게 한다면, name이 'chany'인 document의 comment를 변경하는 것이 아닌, 객체 자체로 대체 되기 때문에 주의가 필요합니다.

반드시 $set을 붙여야하는 점 유의!!

 

✅ 세 번째 인수에 { upsert : true } 제공 시 → 조건에 충족한다면 update, 없다면 insert 처리! 

 

Delete

 

  • 하나의 document를 삭제할 때 → deleteOne 사용
  • 여러 개의 document를 삭제할 때 → deleteMany 사용

 

nodejs> db.users.deleteOne({ name: 'chany' })
{ acknowledged: true, deletedCount: 1 }
nodejs> db.users.find()
[
  {
    _id: ObjectId("649ae224dac0a9124246d195"),
    name: 'strongmin',
    age: 30,
    married: false,
    comment: '안녕하세요. chany친구입니다.',
    createdAt: ISODate("2023-06-27T13:20:36.696Z")
  }
]

삭제된 개수를 보여주면 정상적으로 삭제 된 것입니다.