안녕하세요, 코린이의 코딩 학습기 채니 입니다.
[Node.js 교과서]의 책을 참고하여 포스팅한 개인 공부 내용입니다.
아래 게시글에 이어서 작성하였습니다.
https://chanychu.tistory.com/504
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")
}
]
삭제된 개수를 보여주면 정상적으로 삭제 된 것입니다.
'DataBase > mongoDB' 카테고리의 다른 글
MongoDB) Replica Set 구성 (1) | 2024.01.15 |
---|---|
mongoose) 몽구스 사용하기 - 스키마 사용, 실전 프로젝트 (0) | 2023.07.04 |
mongoDB) 데이터베이스와 컬렉션 생성하기 (0) | 2023.06.27 |
mongoDB) Mac M2 설치 중 connect ECONNREFUSED 127.0.0.1:27017 오류 (0) | 2023.06.23 |
mongoDB) mongoDB 및 compass 다운로드 (Mac M2), 실행하기 (0) | 2023.06.22 |