몽고 DB

김민석·2021년 5월 12일
0

database

목록 보기
1/2

NoSQl

  1. 데이터 구조가 거의 또는 전혀 없는 대용량의 데이터를 저장
  2. 클라우드 컴퓨팅 및 저장공간을 최대한 활용하는 경우
  3. 빠르게 서비스를 구축하고 데이터 구조를 자주 업데이트 하는 경우

ATLAS

아틀라스를 사용한다.

아틀라스의 구조는 다음과 같다.

인스턴스 -> 레플리카 세트 -> 단일 클러스터 -> Clusters

  • 인스턴스 : 몽고DB에서 데이터베이스. 로컬 또는 클라우드에서 특정 소프트웨어를 실행하는 단일 머신

  • 레플리카 세트 : 각각의 인스턴스에 대한 복제본이다.

  • 클러스터 : 데이터를 저장하는 서버 그룹


MongoDb Document

참고 :
mongoDB Doc.

우선 MongoDb는 BSON(Binary JSON) 형태로 데이터를 저장한다고 한다.

{
   field1: value1,
   field2: value2,
   field3: value3,
   ...
   fieldN: valueN
}

value에는 BSON이 대응하는 모든 data tpye을 넣을 수 있다. (아래처럼)

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)
            }

BSON이 정확하게 무엇인지는 모른다.
그러나 JSON보다 빠르고, 메모리 사용에 효율적이며, JSON이 대응하지 않는 다양한 데이터 타입들을 저장할 수 있다고 한다. (보다 컴퓨터 언어에 가깝다.)


Importing & Exporting

터미널에서 해당 명령어를 사용하고 싶으면, Database-Tools-on-macOS를 설치해야한다.

분류JSONBSON
Importmongoimportmongoexport
Exportmongorestoremongodump


CRUD

Collection Methods


CREATE

  • db.컬렉션이름.insert()

컬렉션에 도큐먼트를 추가하는 명령어.
_id 값은 기본적으로 추가된다.

insert에 인자를 배열로 담아주면 bulk insert가 가능

주의

존재하지 않는 collection에 insert 하면 collection을 새로 만들어벌임

  • db.컬렉션이름.find()

찾는거


READ

  • db.컬렉션이름.find(query, options)

query에 조건을 적는다. key:value 형태로 객체로 집어넣으면 되는듯. (연산자들을 활용하여 매우 다양하게 작성할 수 있는 것으로 보인다.)

cursor.pretty()로 객체 형태로 이쁘게 볼 수 있다. 참고로 cursor는 find 메소드를 실행하여 얻어낸 결과의 집합이다.

  • db.컬렉션이름.find().count()
  • db.컬렉션이름.findOne()

한개만 출력


UPDATE

  • db.컬렉션이름.updateOne()

주어진 기준에 맞는 다수의 도큐먼트 중 첫번째 도큐먼트 하나만 업데이트

  • db.collection.updateMany(filter, update, options

해당하는 도큐먼트 모조리 업데이트

$inc 연산자를 활용한 업데이트법

(정말 다양한 연산자들이 있더라.)

db.zips.updateMany({"city":"ALPINE"},{"$inc":{"pop":10}})

주의

둘 다 없는 필드에 값을 추가하고자 하면 필드를 만들어서 추가하게 됨.

  • push
db.grades.updateOne(
	{"student_id" : 250, "class_id" : 339},
	{"$push":{"scores":{"type" : "extra credit", "score":100}}}
)

JS push처럼 배열 속에 데이터를 집어넣는다.

DELETE

  • db.컬렉션이름.deleteOne()

일치하는 하나만 삭제

db.컬렉션이름.deleteMany()

일치하는 모든 것을 삭제

db.컬렉션이름.drop()

컬렉션 자체를 삭제


연산자

비교 연산자

논리 연산자

표현 연산자

{ $expr : { expression } }

{"$expr":{"$eq":["$start station id","$end station id"]}}
이런 식으로 쓴다고 한다.

특히 위에서 filed 값 앞에 붙은 $는 해당 필드의 값을 가리킨다.

배열 연산자

도큐먼트에 배열이 존재하는데, 그 배열 안에 특정 값이 포함 되어 있는 데이터만 찾고 싶다고 가정해보자.

{"amenities":["Shampoo"]}


이 쿼리는 amenities 필드 안에 Shampoo가 있는 것을 찾는 것이 아니라,
amenities 필드의 값이 ["Shampoo"]인 도큐먼트들을 찾는다.

이런 식으로 짜야 shampoo를 포함한 도큐먼트를 찾을 수 있다.{"amenities":{"$all":["Shampoo"]}}


PROJECTION

db.listingsAndRevies.find({"amenities":{"$size":20,
"$all":["internet","wifi","kitcen","heating",...]}},{"price":1,"address":1}).pretty()

이런 식으로 쿼리를 작성하면 priceaddress 필드만 커서에 포함된다.(0이면 해당 필드를 제외)

$elemMatch(projection)

아래와 같은 식으로 작성하면, $elemMatch로 지정한 배열 필드가 도큐먼트에 존재하고 조건에 맞는 요소가 있는 경우에만 해당 필드를 결과에 포함시킨다.

db.grades.find({"class_id":431},{"scores":{"$elemMatch":{"score":{"$gt":85}}}})

$elemMatch(query)

위의 elemMatch를 find의 query 조건에서 사용하면,
해당 조건을 만족하는 도큐먼트의 모든 필드를 불러온다.

0개의 댓글