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

댓글남기기