데이터베이스 NoSQL 기본 (mongoDB) - mongoDB 데이터 입력/수정/검색/삭제 (CRUD)

4. mongoDB 데이터 입력/수정/검색/삭제 (CRUD)

4.1. Document 입력 - insertOne, insertMany

  • insertOne : 한개의 document 생성
  • insertMany : list of document 생성

Document 입력 문법

SQL INSERT 문법과 비교

  • insertOne 예제
db.articles.insertOne(
     { subject: "coffee", author: "xyz", views: 50 }
)
  • insertMany 예제
db.articles.insertMany(
   [
     { subject: "coffee", author: "xyz", views: 50 },
     { subject: "Coffee Shopping", author: "efg", views: 5 },
     { subject: "Baking a cake", author: "abc", views: 90  },
     { subject: "baking", author: "xyz", views: 100 },
     { subject: "Café Con Leche", author: "abc", views: 200 },
     { subject: "Сырники", author: "jkl", views: 80 },
     { subject: "coffee and cream", author: "efg", views: 10 },
     { subject: "Cafe con Leche", author: "xyz", views: 10 },
     { subject: "coffees", author: "xyz", views: 10 },
     { subject: "coffee1", author: "xyz", views: 10 }
   ]
)
실습
1. employees Collection 생성 {capped:true, size:100000} Capped Collection, size는 100000 으로 생성
2. 다음 Document 데이터 넣기
- user_id 가 bcd001, age 가 45, status 가 A 인 Document
- user_id 가 bcd002, age 가 25, status 가 B 인 Document
- user_id 가 bcd003, age 가 50, status 가 A 인 Document
- user_id 가 bcd004, age 가 35, status 가 A 인 Document
- user_id 가 abc001, age 가 28, status 가 B 인 Document

4.2. Document 읽기(검색) - findOne, find

  • findOne : 매칭되는 한개의 document 검색
  • find : 매칭되는 list of document 검색

Document 읽기(검색) 문법

  • find()/findOne 명령과 - SQL 문 비교
db.people.find() - SELECT * FROM people
db.people.find({ }, { user_id: 1, status: 1 }) - SELECT _id, user_id, status FROM people
db.people.find({ },{ user_id: 1, status: 1, _id: 0 }) - SELECT user_id, status FROM people
db.people.find({ status: "A" }) - SELECT * FROM people WHERE status = "A"
db.people.find({ status: "A", age: 50 }) - SELECT * FROM people WHERE status = "A" AND age = 50
db.people.find({ $or: [ { status: "A" } , { age: 50 } ] }) - SELECT * FROM people WHERE status = "A" OR age = 50
실습
1. employees Collection 에서 user_id 가 bcd002 인 Document의 user_id, age, status, _id 출력
2. employees Collection 에서 user_id 가 bcd003 인 Document의 user_id, age, status 출력
3. employees Collection 에서 user_id 가 bcd004 이거나, age가 28인 Document 의 모든 필드 출력

비교 문법

$eq     =    Matches values that are equal to a specified value.
$gt     >    Matches values that are greater than a specified value.
$gte    >=   Matches values that are greater than or equal to a specified value.
$in          Matches any of the values specified in an array.
$lt     <    Matches values that are less than a specified value.
$lte    <=   Matches values that are less than or equal to a specified value.
$ne     !=   Matches all values that are not equal to a specified value.
$nin         Matches none of the values specified in an array.

비교 문법 코드 예제

db.people.find({ age: { $gt: 25 } }) - SELECT * FROM people WHERE age > 25
db.people.find({ age: { $lt: 25 } }) - SELECT * FROM people WHERE age < 25
db.people.find({ age: { $gt: 25, $lte: 50 } }) - SELECT * FROM people WHERE age > 25 AND age <= 50
db.people.find( { user_id: /bc/ } )
db.people.find( { user_id: { $regex: /bc/ } } )
                                                  - SELECT * FROM people WHERE user_id like "%bc%"
db.people.find( { user_id: /^bc/ } )
db.people.find( { user_id: { $regex: /^bc/ } } )
                                                  - SELECT * FROM people WHERE user_id like "bc%"
db.people.find( { status: "A" } ).sort( { user_id: 1 } ) - SELECT * FROM people WHERE status = "A" ORDER BY user_id ASC 
db.people.find( { status: "A" } ).sort( { user_id: -1 } ) - SELECT * FROM people WHERE status = "A" ORDER BY user_id DESC
db.people.count()
db.people.find().count()
                                                  - SELECT COUNT(*) FROM people
db.people.count( { user_id: { $exists: true } } )
db.people.find( { user_id: { $exists: true } } ).count()
                                                  - SELECT COUNT(user_id) FROM people
db.people.count( { age: { $gt: 30 } } )
db.people.find( { age: { $gt: 30 } } ).count()
                                                  - SELECT COUNT(*) FROM people WHERE age > 30
db.people.distinct( "status" ) - SELECT DISTINCT(status) FROM people
db.people.findOne()
db.people.find().limit(1)
                                                  - SELECT * FROM people LIMIT 1
실습
1. 다음 Document 데이터 넣기
- age 가 20 보다 큰 Document 의 user_id 만 출력하기
- age 가 50 이고 status 가 A 인 Document 의 user_id 만 출력하기
- age 가 60 보다 작은 Document 의 user_id 와 age 출력하기
- user_id 종류 출력하기
- user_id 가 bcd 로 시작하는 전체 Document 출력하기

Document 수정 - updateOne, updateMany

  • updateOne - 매칭되는 한개의 document 업데이트
  • updateMany - 매칭되는 list of document 업데이트

4.3. Document 수정 문법

Document 수정 코드 예제

- db.people.updateMany( { age: { $gt: 25 } }, { $set: { status: "C" } } )
- SQL 변환하면, 
  - UPDATE people SET status = "C" WHERE age > 25
- 한 Document만 수정하려면 updateOne을 사용함
- db.people.updateOne( { age: { $gt: 25 } }, { $set: { status: "C" } } )
- db.people.updateMany( { status: "A" } , { $inc: { age: 3 } } )
- SQL 변환하면,
  - UPDATE people SET age = age + 3 WHERE status = "A"
실습
1. 다음 Document 데이터 수정하기
- age 가 40 보다 큰 Document 의 status 를 B 로 변환하기

4.4. Document 삭제 - removeOne, removeMany

  • removeOne - 매칭되는 한개의 document 삭제
  • removeMany - 매칭되는 list of document 삭제

Document 삭제 문법

  • db.people.deleteMany( { status: "D" } )
  • SQL로 변환하면,
    • DELETE FROM people WHERE status = "D"
  • db.people.deleteMany({})
  • SQL로 변환하면,
    • DELETE FROM people
실습
1. 다음 Document 데이터 삭제하기
- age 가 30 보다 작은 Document 삭제하기

참고: mongo shell

  • 로컬에서 서버가 돌아갈 경우,
    • mongo
  • 원격 서버에 접속할 경우
    • mongo --host 'host_address' --port 'port'
    • 예) mongo --host 192.10.21.3 --port 27017