MongoDB 2
MongoDB Queries
General
DB 조회
Enterprise test> show dbs;
admin 40.00 KiB
config 72.00 KiB
local 72.00 KiB
MongoDB에 있는 DB 목록이 조회된다.
DB 선택
Enterprise test> use admin
switched to db admin
Enterprise admin> use config
switched to db config
Enterprise config> use test
switched to db test
특정 DB를 선택해서 해당 DB에서 작업을 수행한다.
Collection 조회
Enterprise test> show collections
해당 DB 내의 collection 목록을 확인할 수 있다.
javascript
Enterprise test> var classroom={name:"classA", students:["A","B","C"]};
Enterprise test> classroom
{ name: 'classA', students: [ 'A', 'B', 'C' ] }
Enterprise test> classroom.name
classA
Enterprise test> classroom.students
[ 'A', 'B', 'C' ]
MongoDB shell의 경우 기본적으로 javascript을 지원하기 때문에, javascript 기반의 스크립트 실행이 가능하다.
CRUD
Create
insertOne
Enterprise test> db.scores.insertOne({a:99});
{
acknowledged: true,
insertedId: ObjectId("63a67083a362493955688f1a")
}
데이터를 저장하면, 해당 데이터에 대한 ObjectId는 자동으로 부여된다. 각각의 document을 나타내는 12바이트 크기로 Time 4바이트, 랜덤값 5바이트, count 값 3바이트로 이루어져있다.
기존의 save 명령어는 insertOne으로 대체되었다. 한번에 여러 개의 document을 입력하고자 하는 경우 insertMany을 활용한다.
Enterprise test> db.scores.insertMany([{b:12},{c:101}]);
{
acknowledged: true,
insertedIds: {
'0': ObjectId("63a670f8a362493955688f1b"),
'1': ObjectId("63a670f8a362493955688f1c")
}
}
Enterprise test> db.scores.find()
[
{ _id: ObjectId("63a67083a362493955688f1a"), a: 99 },
{ _id: ObjectId("63a670f8a362493955688f1b"), b: 12 },
{ _id: ObjectId("63a670f8a362493955688f1c"), c: 101 }
]
Read(Find)
Enterprise test> db.scores.find()
[ { _id: ObjectId("63a67083a362493955688f1a"), a: 99 } ]
javascript을 활용한 save
Enterprise test> for(i=0;i<10;i++){db.scores.insertOne({a:i,exam:5})};
Enterprise test> db.scores.find()
[
{ _id: ObjectId("63a67083a362493955688f1a"), a: 99 },
{ _id: ObjectId("63a670f8a362493955688f1b"), b: 12 },
{ _id: ObjectId("63a670f8a362493955688f1c"), c: 101 },
{ _id: ObjectId("63a6712ba362493955688f1d"), a: 0, exam: 5 },
{ _id: ObjectId("63a6712ba362493955688f1e"), a: 1, exam: 5 },
{ _id: ObjectId("63a6712ba362493955688f1f"), a: 2, exam: 5 },
{ _id: ObjectId("63a6712ba362493955688f20"), a: 3, exam: 5 },
{ _id: ObjectId("63a6712ba362493955688f21"), a: 4, exam: 5 },
{ _id: ObjectId("63a6712ba362493955688f22"), a: 5, exam: 5 },
{ _id: ObjectId("63a6712ba362493955688f23"), a: 6, exam: 5 },
{ _id: ObjectId("63a6712ba362493955688f24"), a: 7, exam: 5 },
{ _id: ObjectId("63a6712ba362493955688f25"), a: 8, exam: 5 },
{ _id: ObjectId("63a6712ba362493955688f26"), a: 9, exam: 5 }
]
javascript을 활용해서 데이터를 반복해서 저장할 수 있다.
Read(Find)
find(조건)
find에 아무런 매개변수를 전달하지 않으면 findAll로 인식되어 모든 document가 조회되게 된다. 하지만, 아래의 경우와 같이 sql의 where 조건문과 같은 조건에 부합하는 document 조회가 가능하다.
Enterprise test> db.scores.find({a:2})
[ { _id: ObjectId("63a6712ba362493955688f1f"), a: 2, exam: 5 } ]
Enterprise test> db.scores.find({exam:5})
[
{ _id: ObjectId("63a6712ba362493955688f1d"), a: 0, exam: 5 },
{ _id: ObjectId("63a6712ba362493955688f1e"), a: 1, exam: 5 },
{ _id: ObjectId("63a6712ba362493955688f1f"), a: 2, exam: 5 },
{ _id: ObjectId("63a6712ba362493955688f20"), a: 3, exam: 5 },
{ _id: ObjectId("63a6712ba362493955688f21"), a: 4, exam: 5 },
{ _id: ObjectId("63a6712ba362493955688f22"), a: 5, exam: 5 },
{ _id: ObjectId("63a6712ba362493955688f23"), a: 6, exam: 5 },
{ _id: ObjectId("63a6712ba362493955688f24"), a: 7, exam: 5 },
{ _id: ObjectId("63a6712ba362493955688f25"), a: 8, exam: 5 },
{ _id: ObjectId("63a6712ba362493955688f26"), a: 9, exam: 5 }
]
조건문을 유심히 보면 json 형태로 이루어진 것을 확인할 수 있는데, 이는 MongoDB에서 json 형태의 데이터를 저장하기 때문에 이른 통한 필터링이 가능하다.
비교연산자를 활용한 조건문
Enterprise test> db.scores.find({a:{"$gt":5}})
[
{ _id: ObjectId("63a67083a362493955688f1a"), a: 99 },
{ _id: ObjectId("63a6712ba362493955688f23"), a: 6, exam: 5 },
{ _id: ObjectId("63a6712ba362493955688f24"), a: 7, exam: 5 },
{ _id: ObjectId("63a6712ba362493955688f25"), a: 8, exam: 5 },
{ _id: ObjectId("63a6712ba362493955688f26"), a: 9, exam: 5 }
]
String | Operator |
---|---|
gt | > |
gte | >= |
lt | < |
lte | <= |
ne | != |
in을 활용한 조건 설정
//in
Enterprise test> db.scores.find({a:{"$in":[2,3,4]}})
[
{ _id: ObjectId("63a6712ba362493955688f1f"), a: 2, exam: 5 },
{ _id: ObjectId("63a6712ba362493955688f20"), a: 3, exam: 5 },
{ _id: ObjectId("63a6712ba362493955688f21"), a: 4, exam: 5 }
]
//not in
Enterprise test> db.scores.find({a:{"$nin":[2,3,4]}})
[
{ _id: ObjectId("63a67083a362493955688f1a"), a: 99 },
{ _id: ObjectId("63a670f8a362493955688f1b"), b: 12 },
{ _id: ObjectId("63a670f8a362493955688f1c"), c: 101 },
{ _id: ObjectId("63a6712ba362493955688f1d"), a: 0, exam: 5 },
{ _id: ObjectId("63a6712ba362493955688f1e"), a: 1, exam: 5 },
{ _id: ObjectId("63a6712ba362493955688f22"), a: 5, exam: 5 },
{ _id: ObjectId("63a6712ba362493955688f23"), a: 6, exam: 5 },
{ _id: ObjectId("63a6712ba362493955688f24"), a: 7, exam: 5 },
{ _id: ObjectId("63a6712ba362493955688f25"), a: 8, exam: 5 },
{ _id: ObjectId("63a6712ba362493955688f26"), a: 9, exam: 5 }
]
OR 연산자
//a의 값이 3보다 작거나 6보다 큰 모든 document 조회
Enterprise test> db.scores.find({$or:[{a:{"$lt":3}},{a:{"$gt":6}}]})
[
{ _id: ObjectId("63a67083a362493955688f1a"), a: 99 },
{ _id: ObjectId("63a6712ba362493955688f1d"), a: 0, exam: 5 },
{ _id: ObjectId("63a6712ba362493955688f1e"), a: 1, exam: 5 },
{ _id: ObjectId("63a6712ba362493955688f1f"), a: 2, exam: 5 },
{ _id: ObjectId("63a6712ba362493955688f24"), a: 7, exam: 5 },
{ _id: ObjectId("63a6712ba362493955688f25"), a: 8, exam: 5 },
{ _id: ObjectId("63a6712ba362493955688f26"), a: 9, exam: 5 }
]
field 존재 여부에 따른 조회
Enterprise test> db.scores.find({exam:{"$exists":true}})
[
{ _id: ObjectId("63a6712ba362493955688f1d"), a: 0, exam: 5 },
{ _id: ObjectId("63a6712ba362493955688f1e"), a: 1, exam: 5 },
{ _id: ObjectId("63a6712ba362493955688f1f"), a: 2, exam: 5 },
{ _id: ObjectId("63a6712ba362493955688f20"), a: 3, exam: 5 },
{ _id: ObjectId("63a6712ba362493955688f21"), a: 4, exam: 5 },
{ _id: ObjectId("63a6712ba362493955688f22"), a: 5, exam: 5 },
{ _id: ObjectId("63a6712ba362493955688f23"), a: 6, exam: 5 },
{ _id: ObjectId("63a6712ba362493955688f24"), a: 7, exam: 5 },
{ _id: ObjectId("63a6712ba362493955688f25"), a: 8, exam: 5 },
{ _id: ObjectId("63a6712ba362493955688f26"), a: 9, exam: 5 }
]
Enterprise test> db.scores.find({exam:{"$exists":false}})
[
{ _id: ObjectId("63a67083a362493955688f1a"), a: 99 },
{ _id: ObjectId("63a670f8a362493955688f1b"), b: 12 },
{ _id: ObjectId("63a670f8a362493955688f1c"), c: 101 }
]
projection
기존에는 document 조회 시 모든 필드가 출력되었지만, 출력하고자 하는 field을 제어할 수 있다.
find({조건문},{출력할 컬럼 정보})
Enterprise test> db.scores.find({exam:{"$exists":true}},{a:1,exam:1,_id:0})
[
{ a: 0, exam: 5 },
{ a: 1, exam: 5 },
{ a: 2, exam: 5 },
{ a: 3, exam: 5 },
{ a: 4, exam: 5 },
{ a: 5, exam: 5 },
{ a: 6, exam: 5 },
{ a: 7, exam: 5 },
{ a: 8, exam: 5 },
{ a: 9, exam: 5 }
]
Update
테스트 데이터 입력
Enterprise test> db.users.insertMany([{name:"Johnny", languages:["ruby","C"]},{name:"Sue",languages:["scala","lisp"]}])
{
acknowledged: true,
insertedIds: {
'0': ObjectId("63a67729a362493955688f27"),
'1': ObjectId("63a67729a362493955688f28")
}
}
update
조건문에 해당하는 document에 대해서 수정을 진행한다.
updateOne({조건문},{수정된 document})
Enterprise test> db.users.updateOne({name:"Johnny"},{name:"Cash",languages:["english"]})
{
acknowledged: true,
insertedId: null,
matchedCount: 1,
modifiedCount: 1,
upsertedCount: 0
}
//기존의 name:"Johnny" 였던 document가 name:"Cash" 인것으로 바뀐 것을 확인할 수 있다.
Enterprise test> db.users.find()
[
{
_id: ObjectId("63a67729a362493955688f27"),
name: 'Cash',
languages: [ 'english' ]
},
{
_id: ObjectId("63a67729a362493955688f28"),
name: 'Sue',
languages: [ 'scala', 'lisp' ]
}
]
update set,unset
set keyword을 이용하면 특정 field 값들만 수정하는 것이 가능하다.
updateOne({조건문},{$set:{수정할 field 정보}})
Enterprise test> db.users.updateOne({name:"Cash"},{$set:{languages:["english","korean"],age:50}})
{
acknowledged: true,
insertedId: null,
matchedCount: 1,
modifiedCount: 1,
upsertedCount: 0
}
Enterprise test> db.users.find()
[
{
_id: ObjectId("63a67729a362493955688f27"),
name: 'Cash',
languages: [ 'english', 'korean' ],
age: 50
},
{
_id: ObjectId("63a67729a362493955688f28"),
name: 'Sue',
languages: [ 'scala', 'lisp' ]
}
]
//unset을 이용하면 특정 field을 삭제할 수 있다.
Enterprise test> db.users.updateOne({name:"Cash"},{$unset:{age:50}})
{
acknowledged: true,
insertedId: null,
matchedCount: 1,
modifiedCount: 1,
upsertedCount: 0
}
Enterprise test> db.users.find()
[
{
_id: ObjectId("63a67729a362493955688f27"),
name: 'Cash',
languages: [ 'english', 'korean' ]
},
{
_id: ObjectId("63a67729a362493955688f28"),
name: 'Sue',
languages: [ 'scala', 'lisp' ]
}
]
update pull,push
field가 배열일 때 특정 원소를 제거하거나 추가할 수 있다.
Enterprise test> db.users.updateOne({name:"Cash"},{$pull:{"languages":"korean"}})
{
acknowledged: true,
insertedId: null,
matchedCount: 1,
modifiedCount: 1,
upsertedCount: 0
}
Enterprise test> db.users.find()
[
{
_id: ObjectId("63a67729a362493955688f27"),
name: 'Cash',
languages: [ 'english' ]
},
{
_id: ObjectId("63a67729a362493955688f28"),
name: 'Sue',
languages: [ 'scala', 'lisp' ]
}
]
//push을 이용하여 배열에 원소를 추가하는 것이 가능하다.
Enterprise test> db.users.updateOne({name:"Cash"},{$push:{"languages":"ruby"}})
{
acknowledged: true,
insertedId: null,
matchedCount: 1,
modifiedCount: 1,
upsertedCount: 0
}
Enterprise test> db.users.find()
[
{
_id: ObjectId("63a67729a362493955688f27"),
name: 'Cash',
languages: [ 'english', 'ruby' ]
},
{
_id: ObjectId("63a67729a362493955688f28"),
name: 'Sue',
languages: [ 'scala', 'lisp' ]
}
]
Delete
delete
조건문에 맞는 document을 제거할 수 있다.
deleteOne({조건문})
Enterprise test> db.users.deleteOne({name:"Sue"})
{ acknowledged: true, deletedCount: 1 }
Enterprise test> db.users.find()
[
{
_id: ObjectId("63a67729a362493955688f27"),
name: 'Cash',
languages: [ 'english', 'ruby' ]
}
]
drop
deleteMany을 통해 모든 document을 수정했다 하더라도 collection은 그대로 남아 있게 된다. 이때 collection도 지우고자 하면 drop을 사용한다.(sql의 drop table과 같은 쿼리이다.)
db.users.drop();
References
- 영상
- 문서
댓글남기기