Create
MongoDB의 모든 Document들은 고유한 값인 "_id"를 가진다. _id 필드 값은 Document를 구별한 역할을 수행한다. Document 내부의 필드 값이 동일한 경우에도 _id 값이 다를 경우 서로 다른 Document가 된다. 반대로 필드값이 다르더라도 _id값이 동일하면 동일한 Document로 간주된다.
개별 Document들은 고유한 _id 값을 가지고 있어야 한다. 새로운 Document를 생성할 때 일반적으로 ObjectId 타입(12byte, 24char)을 값으로 사용한다. 물론 임의로 고유한 값을 생성해서 사용할 수도 있다. 만약 Document를 추가할 때 _id 필드와 값을 명시하지 않으면 자동으로 _id필드가 생성되면서 ObjectId 타입이 할당된다.
MongoDB의 데이터베이스 구조는 Database(DB) -> Collections(Table) -> Document(records)로 구성된다. 새로운 데이터를 추가하는 명령은 insertOne, insertMany, bulkWrite 3가지다.
① Database 생성
기존에 사용중인 데이터베이스가 있는 경우 그대로 사용하고 없는 경우 새로 생성된다. 1개 이상의 collection이 담겨 있어야 화면에 리스트가 출력된다.
> use newDatabase
② Collection 생성
collection은 documens를 저장하는 공간이다. 만약 기존 collection이 존재하는 경우 해당 collection을 사용하고, 만약 존재하지 않는 경우 새로운 collection을 암묵적으로 생성한다.
db.myNewCollection2.insertOne( { x: 1 } )
db.myNewCollection3.createIndex( { y: 1 } )
만약 프로그램에서 첫번째 로직에서 collection을 사용하거나, 특정 옵션을 걸어서 collection을 생성해야 하는 경우 createCollection()을 사용해서 명시적으로 collection을 생성할 수 있다.
> db.createCollection(<name>, { capped: <boolean>,
autoIndexId: <boolean>,
size: <number>,
max: <number>,
storageEngine: <document>,
validator: <document>,
validationLevel: <string>,
validationAction: <string>,
indexOptionDefaults: <document>,
viewOn: <string>,
pipeline: <pipeline>,
collation: <document> } )
③ Documents
먼저 insertOne() 메소드는 아래 syntax를 따라서 생성된다. <document>는 해당 collection에 추가할 데이터이며, <writeConcern>은 write concern을 포함하고 있는 Document다. 생략해도 무방하다. writeConcern은 mongod나 레플리카 셋, 클러스터에 데이터를 쓸 때 MongoDB에서 요청한 승인 수준을 의미한다. Document 생성 이후 write concern이 처리결과인 acknowledged와 Document의 _id를 반환한다.
db.collection.insertOne(
<document>,
{
writeConcern: <document>
}
)
두번째 메소드는 insertMany()다. 2개 이상의 documents를 생성할 때 사용한다. document는 collection에 삽입할 데이터, ordered는 오류가 나는 경우 해당 인스턴스를 뛰어넘게 해준다. 기본값은 true로 설정되어 있다.
db.collection.insertMany(
[ <document 1> , <document 2>, ... ],
{
writeConcern: <document>,
ordered: <boolean>
}
)
Read
① Database
> db //현재 사용중인 데이터베이스 리스팅
> show dbs // 모든 데이터베이스 출력
> db.stats() // 데이터베이스 상태 확인
② Collection
> show collections // 컬렉션 리스트 출력
③ Document
데이터를 읽어 오기 위해서는 db.collection.find()를 사용한다. collection내에 저장된 Documents에서 데이터를 읽어올 수 있다. 특정 쿼리 조건을 사용해서 필터링한 데이터를 읽어올 수 있다. 출력값이 너무 길어서 가독성이 떨어지는 경우 pretty()를 사용해서 보기 좋게 출력할 수 있다.
db.collection.find(query, projection)
- query : document 타입의 쿼리문이다. Optional 이기 때문에 모든 데이터를 조회하기 위해서는 Empty Document ({})를 넣을 수 있다.
- projection : Optional 값이다. Document 타입이며 출력할 Field를 지정할 수 있다. 모든 필드를 출력하기 위해서는 projection을 비워주면 된다. true/false 값으로 필드 출력여부를 지정할 수 있고, 0/1로도 지정가능하다.
Update
① Collection
db.collection.rename("새로운 Collection Name");
② Document
UPDATE 로직은 3가지 메소드를 지원한다.
db.collection.updateOne(
<filter>,
<update>,
{
upsert: <boolean>,
writeConcern: <document>,
collation: <document>
}
)
updateOne() 메소드는 필터링에 충족하는 한개의 Document를 갱신한다. 필터는 Document 타입으로 find() 메소드에서와 사용방법이 동일하다. 만약 빈 Document 타입을 추가할 경우 Document에서 가장 첫번째 데이터가 갱신된다.
db.collection.updateMany(
<filter>,
<update>,
{
upsert: <boolean>,
writeConcern: <document>,
collation: <document>
}
)
2개 이상의 Document를 갱신하는 경우 사용한다.
예를 들어 MongoDB Atlas Sample Dataset의 zips 코드에서 하나의 Document를 가져오자.
{
_id: ObjectId("5c8eccc1caa187d17ca74cdc"),
city: 'ALPINE',
zip: '38543',
loc: { y: 36.380324, x: 85.152153 },
pop: 451,
state: 'TN'
}
위 데이터의 pop을 100만큼 증가한다고 하자. 이 때 사용할 수 있는 MQL(MongoDB SQL)은 $inc다.
mongo> db.zips.updateOne({"city":"ALPINE", "zip":"38543"}, {"$inc":{"pop":100}})
matchedCount와 modifiedCount 모두 1개가 나왔다. 정상적으로 UPDATE가 진행됨. pop이 451에서 551로 변경되었다.
{
acknowledged: true,
insertedId: null,
matchedCount: 1,
modifiedCount: 1,
upsertedCount: 0
}
{
_id: ObjectId("5c8eccc1caa187d17ca74cdc"),
city: 'ALPINE',
zip: '38543',
loc: { y: 36.380324, x: 85.152153 },
pop: 551,
state: 'TN'
}
$inc MQL 대신 $set을 사용해서 특정 값을 지정해서 UPDATE 해줄 수 있다. pop을 777로 지정한 결과다.
db.zips.updateOne({"city":"ALPINE", "zip":"38543"}, {"$set":{"pop":777}})
{
_id: ObjectId("5c8eccc1caa187d17ca74cdc"),
city: 'ALPINE',
zip: '38543',
loc: { y: 36.380324, x: 85.152153 },
pop: 777,
state: 'TN'
}
$set MQL을 사용해서 존재하지 않는 필드값을 UPDATE하면 새로운 필드가 생성된다. 위의 데이터에는 population이라는 필드가 존재하지 않지만 $set으로 생성할수있다.
db.zips.updateOne({"city":"ALPINE", "zip":"38543"}, {"$set":{"population":351123123}})
{
_id: ObjectId("5c8eccc1caa187d17ca74cdc"),
city: 'ALPINE',
zip: '38543',
loc: { y: 36.380324, x: 85.152153 },
pop: 777,
state: 'TN',
population: 351123123
}
$push MQL은 배열로 된 필드에 새로운 요소를 추가해주는 연산자다. scores 필드는 배열을 값으로 가지고 있다. 여기에 새로운 요소를 추가한다.
{
_id: ObjectId("56d5f7eb604eb380b0d8d8e0"),
student_id: 1,
scores: [
{ type: 'exam', score: 90.8264171922822 },
{ type: 'quiz', score: 51.77230177525646 },
{ type: 'homework', score: 68.97104926017997 },
{ type: 'homework', score: 2.8270734687576238 }
],
class_id: 302
}
//updateOne({필터값}, {"$push":{배열 필드:{배열에 추가할 새로운 요소}}})
db.grades.updateOne({"student_id":1, "class_id":302}, {"$push":{"scores":{"type":"extra credit", "score":1000}}});
배열을 값으로 가지고 있는 scroe 필드에 새로운 배열 요소를 추가했다.
{
_id: ObjectId("56d5f7eb604eb380b0d8d8e0"),
student_id: 1,
scores: [
{ type: 'exam', score: 90.8264171922822 },
{ type: 'quiz', score: 51.77230177525646 },
{ type: 'homework', score: 68.97104926017997 },
{ type: 'homework', score: 2.8270734687576238 },
{ type: 'extra credit', score: 1000 }
],
class_id: 302
}
db.collection.replaceOne(
<filter>,
<replacement>,
{
upsert: <boolean>,
writeConcern: <document>,
collation: <document>
}
)
한 개의 Document를 대체한다. update 연산자는 사용할 수 없다.
Delete
ⓘ Database
db.dropDatabase() // 다른 데이터베이스로 이동한 뒤 실행해야 됨
② Collection
db.collection.drop()
③ Document
collection에서 Document를 삭제하는 연산이다. MongoDB에서는 삭제 메소드로 2가지를 제공한다.
db.collection.deleteOne(
<filter>,
{
writeConcern: <document>,
collation: <document>
}
)
한개의 Document를 삭제한다.
db.collection.deleteMany(
<filter>,
{
writeConcern: <document>,
collation: <document>
}
)
필터링되는 모든 Document를 삭제한다.
예제
임의의 데이터를 Document에 삽입했다.
[
{ _id: '1', name: 'About-Tech' },
{
_id: ObjectId("6296025ef90341112b5761e3"),
name: '123jjsdf9#$Jihsj('
},
{
_id: ObjectId("62960260f90341112b5761e4"),
name: '123jjsdf9#$Jihsj('
},
{
_id: ObjectId("62960260f90341112b5761e5"),
name: '123jjsdf9#$Jihsj('
},
{
_id: ObjectId("62960260f90341112b5761e6"),
name: '123jjsdf9#$Jihsj('
},
{
_id: ObjectId("62960261f90341112b5761e7"),
name: '123jjsdf9#$Jihsj('
},
{
_id: ObjectId("62960261f90341112b5761e8"),
name: '123jjsdf9#$Jihsj('
},
{
_id: ObjectId("62960262f90341112b5761e9"),
name: '123jjsdf9#$Jihsj('
},
{
_id: ObjectId("62960262f90341112b5761ea"),
name: '123jjsdf9#$Jihsj('
},
{
_id: ObjectId("62960263f90341112b5761eb"),
name: '123jjsdf9#$Jihsj('
},
{
_id: ObjectId("62960263f90341112b5761ec"),
name: '123jjsdf9#$Jihsj('
}
]
db.collection.deleteOne()을 사용해서 1개의 필드를 삭제한다.
db.testCollection.deleteOne({"name":"123jjsdf9#$Jihsj("});
{ acknowledged: true, deletedCount: 1 }
db.collection.deleteMany()를 사용해서 여러개의 필드를 삭제한다. 총 9개의 필드가 삭제되었다.
db.testCollection.deleteMany({"name":"123jjsdf9#$Jihsj("});
{ acknowledged: true, deletedCount: 9 }
db.collection.drop() 을 사용해 collection을 삭제한다. true를 반환하면서 collection이 정상적으로 삭제된다.
db.testCollection.drop();
true
Reference
'Programming' 카테고리의 다른 글
[Redux] Redux란? 리덕스 사용법 (0) | 2022.06.01 |
---|---|
[Database] MongoDB operators list, 연산자 종류 사용법 (0) | 2022.05.31 |
[Database] MongoDB Document 데이터 BSON JSON 형식 차이점 (0) | 2022.05.31 |
[Database] MongoDB란? NoSQL, 도큐먼트 데이터베이스, cluster replica set Instance (0) | 2022.05.31 |
[Database] 3개 이상 테이블 LEFT RIGHT JOIN 하기 (GROUP BY 사용) (0) | 2022.05.30 |
댓글