데이터베이스 생성
몽고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() 메서드가 결과를 렌더링하는데 추가 시간을 소모할 수 있으므로, 대규모 데이터를 다룰 때는 성능상의 이슈가 있을 수 있다.
'NoSQL' 카테고리의 다른 글
[MongoDB] 도큐먼트(Document), 컬렉션(Collection), 데이터베이스(Database) 개념 (0) | 2024.07.13 |
---|---|
[MongoDB] CentOS7 에서 MongoDB 설치하기 (2) | 2024.04.08 |