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
: ObjectId
name
: 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
: 필드가 지정된 유형인 경우 문서를 선택합니다.
평가 연산자
$expr
: 쿼리 언어 내에서 집계 표현식을 사용할 수 있습니다.
$jsonSchema
: 주어진 JSON Schema에 대해 문서의 유효성을 검사합니다.
$mod
: 필드 값에 대해 모듈로 연산을 수행하고 지정된 결과가 있는 문서를 선택합니다.
$regex
: 지정된 표현식과 일치하는 값이 있는 문서를 선택합니다.
$text
: 텍스트 검색을 수행합니다.
$where
: JavaScript 표현식을 만족하는 문서와 일치시킵니다.