MongoDB
MongoDB는 관계형 데이터베이스가 아닌 필드와 값 쌍으로 구성된 데이터 구조인 문서입니다.
문서의 구조는 JSON과 유사하며, 필드 값에는 다른 문서, 배열 및 문서 배열이 포함될 수 있습니다.
데이터베이스
MongoDB에서 데이터베이스는 하나 이상의 문서 컬렉션을 보유합니다.
데이터베이스 사용
use myDB
데이터베이스 생성
MongoDB에서는 데이터를 처음 저장할 때 데이터베이스가 생성됩니다.
따라서 아래와 같이 데이터베이스를 생성할 수 있습니다.
use myNewDB
db.myNewCollection1.insertOne( { x: 1 } )
컬렉션
컬렉션은 관계형 데이터베이스의 테이블과 유사합니다.
컬렉션 생성
컬렉션도 데이터베이스와 마찬가지로 데이터를 처음 저장할 때 생성됩니다.
db.myNewCollection2.insertOne( { x: 1 } )
db.myNewCollection3.createIndex( { y: 1 } )
문서
MongoDB는 데이터를 BSON 문서로 저장합니다. JSON의 바이너리 표현이지만 JSON보다 더 많은 데이터 유형을 포함합니다.
문서 구조
문서는 필드-값으로 구성되며 아래와 같은 구조를 갖습니다.
{
field1: value1,
field2: value2,
field3: value3,
...
fieldN: valueN
}
필드의 값은 배열, 문서 배열 또는 문자열을 포함하여 모드 BSON의 데이터 유형이 될 수 있습니다.
var mydoc = {
_id: ObjectId("5099803df3f4948bd2f98391"),
name: { first: "Alan", last: "Turing" },
birth: new Date('Jun 23, 1912'),
death: new Date('Jun 07, 1954'),
contribs: [ "Turing machine", "Turing test", "Turingery" ],
views : NumberLong(1250000)
}
_id
: ObjectIdname
: first, last 필드가 포함된 문서birth, death
: Date형식contribs
: 문자열 배열views
: NumberLong형식의 값
필드 이름
필드의 이름은 문자열로 구성되어있습니다.
필드 이름은 제한이 존재합니다.
_id
는 프라이머리 키로 사용되기 때문에 컬렌션에 고유적으로 존재하며, 수정이 불가능합니다.null
문자를 포함할 수 없습니다..
,$
의 사용이 가능합니다.
점 표기법
MongoDB는 .
을 사용하여 배열의 값을 가져올 수 있습니다.
배열
값.인덱스 방식으로 배열의 요소에 접근할 수 있습니다.
"<array>.<index>"
다음과 같은 필드가 존재한다고 가정하겠습니다.
{
...
contribs: [ "Turing machine", "Turing test", "Turingery" ],
...
}
아래 코드는 점 표기법을 통해서 데이터를 조회하는 코드입니다.
db.collection.find({"contribs.0":"Turing machine"})
만일 필드 안에 문서가 지정되어있을 땐 다음과 같이 사용할 수 있습니다.
"<embedded document>.<field>"
다음과 같은 필드가 존재한다고 가정하겠습니다.
{
...
name: { first: "Alan", last: "Turing" },
contact: { phone: { type: "cell", number: "111-222-3333" } },
...
}
아래 코드는 점 표기법을 통해서 데이터를 조회하는 코드입니다.
db.collection.find({"contact.phone.number":"111-222-3333"})
문서 삽입
단일 문서 삽입
db.inventory.insertOne(
{ item: "canvas", qty: 100, tags: ["cotton"], size: { h: 28, w: 35.5, uom: "cm" } }
)
여러 문서 삽입
db.inventory.insertMany([
{ item: "journal", qty: 25, tags: ["blank", "red"], size: { h: 14, w: 21, uom: "cm" } },
{ item: "mat", qty: 85, tags: ["gray"], size: { h: 27.9, w: 35.5, uom: "cm" } },
{ item: "mousepad", qty: 25, tags: ["gel", "blue"], size: { h: 19, w: 22.85, uom: "cm" } }
])
문서 조회
모든 문서 조회
inventory 컬렉션의 모든 문서를 조회합니다.
db.inventory.find( {} )
문서 조건 조회
inventory 컬렌션의 status 필드 값이 “D” 인 모든 문서를 조회합니다.
db.inventory.find( { status: "D" } )
쿼리 연산자를 사용하여 조회
inventory 컬렌션의 status 필드의 값에 “A” 또는 “D” 인 모든 문서를 조회합니다.
db.inventory.find( { status: { $in: [ "A", "D" ] } } )
💡 $or
연산자를 사용할 수 있지만 동일한 필드에서 동등성 검사를 수행할 때에는 $in
연산자를 사용합니다.
AND 조건 지정 조회
inventory 컬렉션의 status 필드의 값이 “A”이고, qty 필드의 값이 30보다 작은 모든 문서를 조회합니다.
db.inventory.find( { status: "A", qty: { $lt: 30 } } )
OR 조건 지정 조회
inventory 컬렉션의 status 필드의 값이 “A” 이거나, qty 필드의 값이 30보다 작은 모든 문서를 조회합니다.
db.inventory.find( { $or: [ { status: "A" }, { qty: { $lt: 30 } } ] } )
AND, OR 조건 지정 조회
inventory 컬렉션의 status 필드의 값이 “A”이면서, qty 필드 값이 30보다 적거나, item 필드 값의 이름이 p로 시작하는 모든 문서를 조회합니다.
db.inventory.find( {
status: "A",
$or: [ { qty: { $lt: 30 } }, { item: /^p/ } ]
} )
배열 조회
inventory 컬렉션의 tags 필드 배열 값이 “red”, “blank” 순서로 되어 있는 모든 문서를 조회합니다.
db.inventory.find( { tags: ["red", "blank"] } )
순서에 상관없이 조회 시 $all
를 사용할 수 있습니다.
db.inventory.find( { tags: { $all: ["red", "blank"] } } )
여러 기준을 충족하는 배열 요소 조회하기
$elemMatch
연산자를 사용하면 배열 요소에 여러 기준을 지정합니다.
inventory 컬렉션의 dim_cm 필드의 배열 값이 22 보다 크고 33보다 작은 값이 하나 이상 포함되어 있는 문서를 조회합니다.
db.inventory.find( { dim_cm: { $elemMatch: { $gt: 22, $lt: 30 } } } )
지정된 필드만 반환
inventory 컬렉션의 status 필드의 값이 “A”인 문서들의 item, ststus 요소만 반환합니다.
db.inventory.find( { status: "A" }, { item: 1, status: 1 } )
지정된 필드를 제외하고 반환
inventory 컬렉션의 status 필드의 값이 “A”인 문서들의 item, ststus 요소를 제외한 모든 필드 반환합니다.
db.inventory.find( { status: "A" }, { status: 0, instock: 0 } )
문서 수정
단일 문서 수정
item 필드의 값이 “paper”인 하나의 문서를 $set
연산자를 이용하여 size필드의 uom필드의 값을 “cm”으로 변경하고, status 필드값을 “P”로 변경합니다. $currentDate
연산자를 이용하여 lastModified 필드의 값을 현재 날짜로 변경합니다.
db.inventory.updateOne(
{ item: "paper" },
{
$set: { "size.uom": "cm", status: "P" },
$currentDate: { lastModified: true }
}
)
여러 문서 수정
qty 필드의 값이 50보다 작은 모든 문서를 $set
연산자를 이용하여 size필드의 uom필드의 값을 “in”으로 변경하고, status 필드값을 “P”로 변경합니다. $currentDate
연산자를 이용하여 lastModified 필드의 값을 현재 날짜로 변경합니다.
db.inventory.updateMany(
{ "qty": { $lt: 50 } },
{
$set: { "size.uom": "in", status: "P" },
$currentDate: { lastModified: true }
}
)
문서 교체
db.inventory.replaceOne(
{ item: "paper" },
{ item: "paper", instock: [ { warehouse: "A", qty: 60 }, { warehouse: "B", qty: 40 } ] }
)
문서 삭제
모든 문서 삭제
db.inventory.deleteMany({})
조건과 일치하는 모든 문서 삭제
inventory 컬렉션의 status 필드의 값이 “A”인 모든 문서를 삭제합니다.
db.inventory.deleteMany({ status : "A" })
조건과 일치하는 단일 문서 삭제
inventory 컬렉션의 status 필드의 값이 “D”인 하나의 문서를 삭제합니다.
db.inventory.deleteOne( { status: "D" } )
연산자
비교 연산자
$eq
: 지정된 값과 같은 값을 일치시킵니다.$gt
: 지정된 값보다 큰 값을 일치시킵니다.$gte
: 지정된 값보다 크거나 같은 값을 찾습니다.$in
: 배열에 지정된 값과 일치시킵니다.$lt
: 지정된 값보다 작은 값을 일치시킵니다.$lte
: 지정된 값보다 작거나 같은 값을 찾습니다.$ne
: 지정된 값과 같지 않은 모든 값을 찾습니다.$nin
: 배열에 지정된 값 중 어느 것과도 일치하지 않습니다.
논리 연산자
$and
: 논리적AND
사용하여 쿼리 절을 조인하면 두 절의 조건과 일치하는 모든 문서를 반환합니다.$not
: 쿼리 표현식의 효과를 반전시키고 쿼리 표현식과 일치하지 않는 문서를 반환합니다.$nor
: 논리적NOR
사용하여 쿼리 절을 조인하면 두 절과 일치하지 않는 모든 문서를 반환합니다.$or
: 논리적OR
사용하여 쿼리 절을 조인하면 두 절의 조건과 일치하는 모든 문서를 반환합니다.
요소 연산자
$exists
: 지정된 필드가 있는 문서와 일치시킵니다.$type
: 필드가 지정된 유형인 경우 문서를 선택합니다.