본문 바로가기
컴퓨터/NoSQL 데이터베이스

[DB] 몽고 DB의 CRUD(생성, 읽기, 수정, 삭제) 작업/각종 쿼리 연산

by 도도새 도 2023. 4. 29.

몽고DB의 CRUD

 

 몽고DB는 다양한 CRUD작업과, 그를 용이하게 도와주는 각종 쿼리를 지원한다. 몽고 DB에서 CRUD작업을 하는 방법에 대해서 정리한다.

 

컬렉션 생성 삭제

 

 우선 DB와 Collection의 생성과 삭제이다.

 

데이터 베이스

 

데이터베이스 생성

 

우선 데이터 베이스 생성은 use키워드를 사용한다.

 

use dbName

 

만약 dbName이라는 데이터베이스가 존재한다면, 해당 데이터베이스에 접근하게 되며, 존재하지 않을 경우 해당 이름으로 db를 생성하게 된다.

 

생성된 db들은 show dbs 명령어로 확인할 수 있다.

 

데이터베이스 삭제

 

데이터베이스를 삭제하려면 아래 순서를 따른다.

use dbName

db.dropDatabase()

 

 

컬렉션

렉션 생성

 

컬렉션의 경우 특정 Database에 접근 한 후(use) 아래 명령어를 입력한다.

db.createCollection(“collection name”)

 

컬렉션 삭제

 

컬렉션 삭제는 db.collectionName.drop()으로 삭제 가능하다.

db.collectionName.drop()

 

컬렉션 확인

 

show collections을 입력하면 생성된 컬렉션들을 볼 수 있다.

show collections

 

도큐먼트 CREATE

 

 몽고 DB에서는 insert연산을 통해 컬렉션 내부에 도큐먼트를 생성할 수 있다. insert의 경우 기본적으로 삽입이지만, 만약 해당 도큐먼트나 컬렉션이 없을 경우 생성까지 할 수 있다.

 

아래의 명령어를 사용하여 insert를 사용할 수 있다.

db.collectionName.insertOne()

db.collectionName.insertMany()

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
use tempDatabase
 
db .createCollection (“employee ”)
 
db .employee .insertOne ({
  "name":"cheolsu",
  "age":29 ,
  "department":"IT"
})
 
db .employee .insertMany ([
    {"name":"sususu",
   "age":12 ,
   "department":"IT"
   },
   {"name":"minjeong",
   "age":21 ,
   "department":"IT"
   }
  ])
 
cs

 

insertMany()의 경우 아래의 형식을 따른다.

 

, 배열 형식으로 다수의 도큐먼트를 입력받으며, 옵션으로 두 가지 값을 받을 수 있다.

 

이때 적절한(겹치지 않는) _id가 자동으로 생성된다.

 

도큐먼트 READ

 

읽기의 경우 find를 사용한다. find를 사용하여 컬렉션에서 도큐먼트를 검색할 수 있는데, 이때 다양한 쿼리를 사용하여 검색 조건을 설정할 수 있다.

 

모든 데이터 조회

db.collectionName.find({})

 

특정 조건을 만족하는 데이터 조회

find({<field1> : <value1>, ...})

 

위의 형식을 통해 특정 값을 조회할 수 있다.

 

이름이 sususu인 경우 조회

db .employee .find ({name :sususu ”})

출력값

  { "_id" : ObjectId("6447f2d5b1e44249bd4e614f"), "name" : "sususu", "age" : 12, "department" : "IT" }

 

 + )컴마로 여러개의 조건을 연결 할 수 있다. 이때 각 조건은 and로 결합된다. 즉 ,

db .employee .find ({name :sususu ”, age:"11"})

위처럼 작성되면 이름은 sususu이고 (and) 나이는 11인 데이터를 출력한다.

 

+ 각종 쿼리

각종 쿼리를 사용하는 방법을 여기에서 정리하도록 한다.

 

$in

$in을 사용하면 조건을 여러개로 줄 수도 있다.

 

나이가 21이거나 12인 도큐먼트 조회

db .employee .find ({age : { $in : [21 , 12 ] } } )

출력값

{ "_id" : ObjectId("6447f2d5b1e44249bd4e614f"), "name" : "sususu", "age" : 12, "department" : "IT" }

{ "_id" : ObjectId("6447f2d5b1e44249bd4e6150"), "name" : "minjeong", "age" : 21, "department" : "IT" }

 

비교 연산

 

$eq (equals) 주어진 값과 일치하는 값

$gt (greater than) 주어진 값보다 큰 값

$gte (greather than or equals) 주어진 값보다 크거나 같은 값

$lt (less than) 주어진 값보다 작은 값

$lte (less than or equals) 주어진 값보다 작거나 같은 값

$ne (not equal) 주어진 값과 일치하지 않는 값

$in 주어진 배열 안에 속하는 값

$nin 주어빈 배열 안에 속하지 않는 값

 

논리 연산

 

$or 주어진 조건중 하나라도 true 일 때 true

$and 주어진 모든 조건이 true 일 때 true

$not 주어진 조건이 false 일 때 true

$nor 주어진 모든 조건이 false 일때 true

 

요소

$exists 특정 필드를 가진 도큐먼트를 매치

$type 필드가 특정한 타입일 경우 선택

db.collection.find({ age: { $type: "number" } })
 
db.collection.find({ name: { $type: "null" } })

 

평가

$expr : 쿼리 랭귀지로 Aggregation(집계)이 가능하도록 해줌, 즉 여러 개의 필드를 조합하는 것이 가능

db.collection.find({ $expr: { $gt: [ "$age", "$anotherAge" ] } })

age와 anotherAge중 큰 것을 선택 $expr을 사용하여 필드의 값들을 비교할 수 있게 되었다.

 

$jsonSchema : 주어진 JSON Schema를 바탕으로 도큐먼트를 평가하여 스키마에 맞지 않으면 거부

$mod:  필드의 값에 모듈러 연산을 한 후, 특정한 결과를 가진 도큐먼트를 선택

$regex : 정규표현식에 맞는 값을 가진 도큐먼트를 선택

$text :  텍스트 검색을 수행

$where 특정 자바스크립트 표현을 만족하는 도큐먼트 선택

db.collection.find({ $where: function() { return this.age > 30; } })

age가 30이상일 경우를 찾음

 

이외에도 지리 관련, 배열 관련, 비트 관련 연산이 존재한다.

https://www.mongodb.com/docs/manual/reference/operator/query/#std-label-query-selectors

 

Query and Projection Operators — MongoDB Manual

Docs Home → MongoDB Manual For details on a specific operator, including syntax and examples, click on the link to the operator's reference page.For comparison of different BSON type values, see the specified BSON comparison order.NameDescriptionMatches

www.mongodb.com

 

도큐먼트 수정

 

몽고 DB의 업데이트 작업의 경우 아래 메서드들을 사용한다.

db.collection.updateOne(filter, update, options)
db.collection.updateMany(filter, update, options)
db.collection.replaceOne(filter, replacement, options)

 

filter: 업데이트를 적용할 도큐먼트를 필터링하는데 사용되는 조건을 지정

update: 필터링된 문서에 적용할 업데이트 연산을 지정

options: 업데이트 옵션을 지정

 

updataOne()은 단일 도큐먼트를 수정, updateMany()는 도큐먼트 여러개를 수정, replaceOne()은 도큐먼트 전체를 교체한다. replaceOne()을 쓸 경우 기존에 존재하는 도큐먼트의 추가, 수정, 삭제가 불가능하다. 단지 새로운 도큐먼트로 뒤짚어 씌울 뿐이다.

 

예시) $set을 사용하면 특정 필드 값만 변경 가능하다.

변경 전

{ "_id" : ObjectId("6447f1f901343e4b4da31a51"), "name" : "ChoelSu", "age" : 29, "department" : "IT" }
{ "_id" : ObjectId("6447f2d5b1e44249bd4e614f"), "name" : "sususu", "age" : 12, "department" : "IT" }
{ "_id" : ObjectId("6447f2d5b1e44249bd4e6150"), "name" : "minjeong", "age" : 21, "department" : "IT" }

db.employee.updateOne({ age: { $gt: 20 } }, { $set: { name: "gt20" }})

 

변경 후 

{ "_id" : ObjectId("6447f1f901343e4b4da31a51"), "name" : "gt20", "age" : 29, "department" : "IT" }
{ "_id" : ObjectId("6447f2d5b1e44249bd4e614f"), "name" : "sususu", "age" : 12, "department" : "IT" }
{ "_id" : ObjectId("6447f2d5b1e44249bd4e6150"), "name" : "minjeong", "age" : 21, "department" : "IT" }

 

도큐먼트 삭제

 

몽고 DB에서 삭제의 경우 아래 메서드를 사용한다.

db.collection.deleteMany(filter, options)

db.collection.deleteOne(filter, options)

filter : 삭제를 적용할 도큐먼트를 필터링하는데 사용되는 조건을 지정, find와 동일한 구문을 사용하면 된다.

db.collection.deleteMany({})를 사용하면 컬렉션의 모든 데이터를 삭제할 수 있다.

db.users.deleteOne({ name: "Alice" })

위 메서드를 사용하면 이름이 Alice인 첫 번째 도큐먼트를 삭제하게 된다.

 

Delete 예시

변경전

{ "_id" : ObjectId("6447f1f901343e4b4da31a51"), "name" : "gt20", "age" : 29, "department" : "IT" }
{ "_id" : ObjectId("6447f2d5b1e44249bd4e614f"), "name" : "sususu", "age" : 12, "department" : "IT" }
{ "_id" : ObjectId("6447f2d5b1e44249bd4e6150"), "name" : "minjeong", "age" : 21, "department" : "IT" }

db.employee.deleteMany({name:{$in:["mimi", "sususu", "gt20"]}})

 

변경후

{ "_id" : ObjectId("6447f2d5b1e44249bd4e6150"), "name" : "minjeong", "age" : 21, "department" : "IT" }

댓글