Mongo DB - Compass CLI로 기본적인 CRUD
Compass CLI로 기본적인 CRUD
1.데이터베이스 생성과 collection
1.1. MogoDB 데이터 베이스 생성
MongoDB는 db를 생성하지 않아도 해당 db의 데이터를 생성하면 해당 db가 생성이된다.
1.2. 명령어 db.users.insertOne()
db.users.insertOne({name:"Sam Kim", email:"samail@gmail.com"})
해당 명령어를 쳤을때 출력되는 결과는 해당 명령어가 성공했다는 의미이다.
1.3. 생성된 users데이터 모두 조회
db.users.find()
find() 함수를 사용하여 명령어를 실행하면 users에 관련된 데이터를 모두 조회해온다.
1.4. 새로고침
위 과정을 모두 거치고 database를 새로고침하면 blog 데이터베이스가 생성되어 있다.
그리고 blog 데이터베이스 아래에는 users라는 collection이 생성되어 있다.
더불어 자동으로 같이 생성된 ObjectId('668e0~') MongoDB에서 자동으로 생성해주는 Unique key이다. 관계형 DB에 Primary Key에 해당한다.
2. Schemaless 특성 특징
2.1. users.name에 string이 아닌 객체 넣기
db.users.insertOne({name:{first:"Toast", last:"Lemon"}})
2.2. db.users.find()
db.users.find()
객체형태의 name을 insert하고 db.user.find()를 하면 2개의 객체가 모두 조회되는 것을 확인할 수 있다. RDB에서는 데이터를 표형식으로 저장하는데 MongoDB는 표가 아니라 객체 형태를 저장한다. RDB의 테이블 형식과 완전히 다르다. 위 그림처럼 객체안에 속성으로 객체를 넣을 수도 있고, 객체안의 속성으로 배열을 넣을 수 도 있다. 이 특성을 Schemaless라고 한다.
3. update(수정) document
3.1. 명령어 db.users.updateOne()
db.users.updateOne({name:"Sam Kim"}, {$set:{age:30}})
updateOne()에는 2개의 파라미터가 들어가는데 2개다 모두 객체 type이다. 첫 번째 파라미터는 "수정할 객체 조건"에 대한 것이고 두번 째 파라미터는 "어떻게 수정할지"에 대한 내용이다.
위 명령어를 실행하면 다음과 같은 내용을 출력한다. 하나씩 살펴보면 다음과 같다.
- matchedCount :1 => 매치되는 data가 1개 존재
- modifiedCount : 1 => 1개의 data수정
3.2. 명령어 db.user.findOne()으로 확인
db.users.findOne({name:"Sam Kim"})
age속성이 추가된 것을 확인할 수 있다.
4. update(수정) nested document
4.1. 명령어 db.users.findOne()
db.users.findOne({"name.first":"Toast"})
만약 특정 속성에 dept가 깊다면 " "(쌍따옴표)와 .(점)을 활용해서 원하는 속성을 표현해주어야 한다.
4.2 dept가 존재하는 속성 update
db.users.updateOne({"name.first":"Toast"},{ $set: {"name.last":"Apple"} })
정상적으로 수정이 되어있는것을 확인할 수 있다.
5. update(수정) with ObjectID
db.user.updateOne({},{})을 사용할때 name을 사용해서 탐색을 했는데 name의 경우에는 추후에도 변경될 가능성이 있다. 그래서 ObjectId를 사용하는 편이 좋다.
5.1. 잘못된 ObjectId 사용법
db.users.findOne({_id:"668e037dba8f4c49f0091e3c"})
_id가 그냥 stirng type이 아니라 ObjectId 타입으로 저장되어 있기 때문이다.
5.2. Compass CLI에서 ObjectId사용
db.users.findOne({_id: ObjectId("668e037dba8f4c49f0091e3c")})
_id는 ObjectId 타입으로 조회해야한다. 더불어 ObjectId는 바꾸지 않는값이기 때문에 해당 객체를 찾거나 update할때는 _id속성을 사용하는 것이 바람직하다.
5.3. ObjectId를 사용한 updateOne() 메서드 ($set, $inc)
#db.users.updateOne({_id: ObjectId("668e037dba8f4c49f0091e3c")},{ $set:{age:31}})
db.users.updateOne({_id: ObjectId("668e037dba8f4c49f0091e3c")},{ $inc:{age:1}})
findOne()메서드로 조회해보면 나이가 +1 되어 있는 것을 확인할 수 있다.
5. Delete(삭제) document
db.users.deleteOne({_id:ObjectId("668e037dba8f4c49f0091e3c")})
users collection 모든document 조회
앞서 삭제한 ObjectId의 document가 삭제된 것을 확인할 수 있다.