본문 바로가기

NoSQL

[MongoDB] 데이터베이스(Database), 컬렉션(Collection), 도큐먼트(Document) 삽입, 갱신, 삭제 및 조회

반응형

 


 

데이터베이스 생성

몽고DB 에서 데이터베이스 생성은 RDBMS 와는 다르다.
명시적으로 데이터베이스를 생성하는 명령문은 없으며, 데이터베이스를 사용하고 컬렉션을 생성하거나 도큐먼트를 삽입하면 데이터베이스가 생성된다.

1. 데이터베이스 선택

use myDatabase

위 명령을 실행하면 myDatabase 라는 이름의 데이터베이스가 선택된다. 이후에 이 데이터베이스에서 컬렉션을 생성하거나 도큐먼트를 삽입하면 데이터베이스가 생성이 된다.

 

2. 컬렉션(Collection) 생성

db.createCollection("myCollection")

위 createCollection 메서드를 사용하여 컬렉션을 생성할 수 있다.
컬렉션을 생성한 후, 데이터베이스를 조회하면 myDatabase 데이터베이스가 생성된 것을 확인 할 수 있다.

또는

3. 도큐먼트(Document) 삽입

db.myCollection.insertOne({name:"철수", age:22})

위 insertOne 명령어를 사용하면 컬렉션이 없는 경우, 데이터를 삽입하는 시점에 컬렉션이 자동으로 생성된다.
이 또한 데이터베이스를 조회하면 myDatabase 데이터베이스가 생성되 것을 확인 할 수 있다.

 

도큐먼트(Document) 조회

도큐먼트를 조회하는 데 find 와 findOne 명령어를 사용한다.

1. find 명령어

컬렉션 내에서 여러 도큐먼트를 검색하는 데 사용된다. 이 명령어는 검색 조건에 맞는 모든 문서를 반환하며, 커서를 사용하여 결과를 처리할 수 있다.

db.collection.find(query, projection)

 - query: 검색 조건을 지정하는 객체이다. (선택 사항, 기본값은 '{}')
 - projection: 반환할 필드를 지정하는 객체이다. (선택 사항)

1) 모든 도큐먼트 조회

db.myCollection.find()
[
  { _id: ObjectId('6690ec0b326dcb94c3c4e49b'), name: '철수', age: 22 },
  {
    _id: ObjectId('6690f0a5326dcb94c3c4e49c'),
    name: '영희',
    age: 34,
    region: '서울'
  },
  {
    _id: ObjectId('6690f0bf326dcb94c3c4e49d'),
    name: '수중',
    height: 180
  }
]

 

2) 특정 조건에 맞는 도큐먼트 조회

나이가 30 이상인 도큐먼트 조회

db.myCollection.find({age:{$gte:30}})
[
  {
    _id: ObjectId('6690f0a5326dcb94c3c4e49c'),
    name: '영희',
    age: 34,
    region: '서울'
  }
]

$gte 는 비교 연산자로, greater than or equal to 를 의미한다. 이는 특정 값보다 크거나 같은 값을 찾기 위해 사용된다.

*비교연산자
 - $eq: equal (=, 같다)
 - $ne: not equal (<>, 같지 않다)
 - $gt: greater than ( >, 크다)
 - $gte: greater than or equal to (>=, 크거나 같다)
 - $lt: less than (<, 작다)
 - $lte: less than or equal to (<=, 작거나 같다)
 - $in: or (배열 내의 값과 일치)
 - $nin: not in (배열 내의 값과 일치하지 않음)

 

3) 특정 필드만 조회

MongoDB 에서는 프로젝션(DBMS 의 경우, SELECT 컬럼명1, 컬럼명2) 을 사용할 때, 필드 포함은 1, 필드 제외는 0 으로 표현한다. 단, 동일한 객체 내에서 일부 필드는 포함하고, 일부 필드는 제외할 수 없다.
즉, 포함(1) 또는 제외(0) 중 하나만 선택해야 한다.

아래 예를 보자.
 - 나이가 20 이상인 도큐먼트의 name, age 필드 포함 또는 region 필드 제외

db.myCollection.find({age:{$gte:20}},{name: 1, age: 1, region: 0})
MongoServerError[Location31254]: Cannot do exclusion on field region in inclusion projection

일부 필드를 포함하고, 일부 필드를 제외하니 오류가 발생하는 것을 확인할 수 있다.
제대로 된 예시를 보자.

 - 나이가 20 이상인 도큐먼트의 region 필드만 제외

db.myCollection.find({ age: { $gte: 20 } }, { region: 0 })
[
  { _id: ObjectId('6690ec0b326dcb94c3c4e49b'), name: '철수', age: 22 },
  { _id: ObjectId('6690f0a5326dcb94c3c4e49c'), name: '영희', age: 34 }
]

 

 - 나이가 20 이상인 도큐먼트의  name, age 필드만 조회 (_id 필드 제외)

db.myCollection.find({ age: { $gte: 20 } }, { name: 1, age: 1, _id: 0 })
[ { name: '철수', age: 22 }, { name: '영희', age: 34 } ]

*단, _id 필드는 기본적으로 모든 도큐먼트에 포함이 되며, 데이터베이스의 기본 키 역할을 하기 때문에 명시적으로 제외할 수 있다!

 

4) 정렬 및 쿼리 조회수 제한

전체 데이터를 조회하고, name 필드만 조회하며, name 필드로 정렬 후 상위 2개의 도큐먼트를 조회

db.myCollection.find({}, { name: 1, _id: 0 }).sort({ name: 1 }).limit(2)
[ { name: '수중' }, { name: '영희' } ]

 

 

2. findOne 명령어

컬렉션 내에서 하나의 도큐먼트를 검색하는 데 사용된다. 검색 조건에 맞는 첫 번째 도큐먼트를 반환하며, 단일 문서로 반환된다.

db.collection.fineOne(query, projection)

 - query: 검색 조건을 지정하는 객체이다. (선택 사항, 기본값은 '{}')
 - projection: 반환할 필드를 지정하는 객체이다. (선택 사항)

 

1) 첫 번째 도큐먼트 조회

db.myCollection.findOne()
{ _id: ObjectId('6690ec0b326dcb94c3c4e49b'), name: '철수', age: 22 }

 

2) 특정 조건에 맞는 첫 번째 도큐먼트 조회

db.myCollection.findOne({age: {$gte:20} })
{ _id: ObjectId('6690ec0b326dcb94c3c4e49b'), name: '철수', age: 22 }

 

3) 첫 번째 도큐먼트의 특정 필드만 조회

 db.myCollection.findOne({age: {$gte:20} }, {name: 1, _id:0})
{ name: '철수' }

 

 

도큐먼트(Document) 갱신

도큐먼트를 갱신하는 데 updateOne, updateMany 또는 replaceOne 명령어를 사용한다. $set 이라는 갱신 연산자를 이용한다.

 

1. updateOne

하나의 문서만 갱신하는데 사용된다. 첫 번째 인자로는 갱신할 도큐먼트를 찾기 위한 조건을 지정하고, 두 번째 인자로는 수행할 갱신 작업을 지정한다.

# name=철수인 첫 번째 도큐먼트의 age 를 30 으로 변경
 db.myCollection.updateOne({name:"철수"},{$set:{age:30}})
{
  acknowledged: true,
  insertedId: null,
  matchedCount: 1,
  modifiedCount: 1,
  upsertedCount: 0
}

# name=철수인 첫 번째 도큐먼트 조회
db.myCollection.find({name:"철수"})
[ { _id: ObjectId('6690ec0b326dcb94c3c4e49b'), name: '철수', age: 30 } ]

 

2. updateMany

조건에 맞는 여러 도큐먼트를 동시에 갱신한다.

# 전체 도큐먼트 조회
db.myCollection.find()
[
  { _id: ObjectId('6690ec0b326dcb94c3c4e49b'), name: '철수', age: 30 },
  {
    _id: ObjectId('6690f0a5326dcb94c3c4e49c'),
    name: '영희',
    age: 34,
    region: '서울'
  },
  {
    _id: ObjectId('6690f0bf326dcb94c3c4e49d'),
    name: '수중',
    height: 180
  }
]

# age 필드가 30 이상인 도큐먼트의 height=160 으로 업데이트
db.myCollection.updateMany({age:{$gte:30}}, {$set:{height:160}})
{
  acknowledged: true,
  insertedId: null,
  matchedCount: 2,
  modifiedCount: 2,
  upsertedCount: 0
}

# 전체 도큐먼트 조회
db.myCollection.find()
[
  {
    _id: ObjectId('6690ec0b326dcb94c3c4e49b'),
    name: '철수',
    age: 30,
    height: 160
  },
  {
    _id: ObjectId('6690f0a5326dcb94c3c4e49c'),
    name: '영희',
    age: 34,
    region: '서울',
    height: 160
  },
  {
    _id: ObjectId('6690f0bf326dcb94c3c4e49d'),
    name: '수중',
    height: 180
  }
]

위 예제를 보면, 특정 필드를 update 하는데, 필드가 없으면 자동으로 추가가 되는 것도 확인할 수 있다.

 

3. replaceOne

도큐먼트 전체를 새로운 도큐먼트로 교체한다. 이 때, _id 필드는 유지되며, 기존 도큐먼트의 나머지 필드들은 새로운 도큐먼트로 대체된다.

# name 이 수중인 첫 번째 도큐먼트의 전체 내용을 교체
db.myCollection.replaceOne({ name: "수중" }, { name: "수중", age: 28, height:175, region:"인천" })
{
  acknowledged: true,
  insertedId: null,
  matchedCount: 1,
  modifiedCount: 1,
  upsertedCount: 0
}

# name 이 수중인 도큐먼트 조회
db.myCollection.find({name: "수중"})
[
  {
    _id: ObjectId('6690f0bf326dcb94c3c4e49d'),
    name: '수중',
    age: 28,
    height: 175,
    region: '인천'
  }
]

 

 

도큐먼트(Document) 삭제

도큐먼트를 삭제하는 데 deleteOne, deleteMany 명령어를 사용한다.

 

1. deleteOne

조건에 맞는 첫 번째 도큐먼트 삭제한다.

# name 이 철수인 첫 번째 도큐먼트 삭제
db.myCollection.deleteOne({name: "철수"})
{ acknowledged: true, deletedCount: 1 }

 

2. deleteMany

조건에 맞는 모든 도큐먼트를 삭제한다.

# age 필드가 20 이상인 모든 도큐먼트 삭제
db.myCollection.deleteMany({age: {$gte: 20}})
{ acknowledged: true, deletedCount: 2 }

 

 

도큐먼트(Document) 구조화

도큐먼트의 쿼리 결과를 읽기 쉬운 형식으로 출력하는데 사용된다. 이 메서드는 MongoDB Shell 에서만 사용할 수 있다.

# 도큐먼트 일반 조회
db.myCollection.find()
[ { _id: ObjectId('6694872cccad7b85f1c4e49b'), name: '철수', age: 30 } ]

# pretty() 메서드 사용하여 도큐먼트 조회
db.myCollection.find().pretty()
[
	{
    	_id: ObjectId('6694872cccad7b85f1c4e49b'),
        name: '철수',
        age: 30
    }
]

이는 쿼리 결과를 보다 더 명확하게 구분이 되어 문서의 구조를 파악하는데 도움을 준다. 하지만, pretty() 메서드가 결과를 렌더링하는데 추가 시간을 소모할 수 있으므로, 대규모 데이터를 다룰 때는 성능상의 이슈가 있을 수 있다.

 

 

반응형