아틀라스를 사용한다.
아틀라스의 구조는 다음과 같다.
인스턴스 -> 레플리카 세트 -> 단일 클러스터 -> Clusters
인스턴스 : 몽고DB에서 데이터베이스. 로컬 또는 클라우드에서 특정 소프트웨어를 실행하는 단일 머신
레플리카 세트 : 각각의 인스턴스에 대한 복제본이다.
클러스터 : 데이터를 저장하는 서버 그룹
참고 :
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이 대응하지 않는 다양한 데이터 타입들을 저장할 수 있다고 한다. (보다 컴퓨터 언어에 가깝다.)
터미널에서 해당 명령어를 사용하고 싶으면, Database-Tools-on-macOS를 설치해야한다.
분류 | JSON | BSON |
---|---|---|
Import | mongoimport | mongoexport |
Export | mongorestore | mongodump |
db.컬렉션이름.insert()
컬렉션에 도큐먼트를 추가하는 명령어.
_id
값은 기본적으로 추가된다.insert에 인자를 배열로 담아주면
bulk insert
가 가능주의
존재하지 않는 collection에 insert 하면 collection을 새로 만들어벌임
db.컬렉션이름.find()
찾는거
db.컬렉션이름.find(query, options)
query에 조건을 적는다.
key:value
형태로 객체로 집어넣으면 되는듯. (연산자들을 활용하여 매우 다양하게 작성할 수 있는 것으로 보인다.)
cursor.pretty()
로 객체 형태로 이쁘게 볼 수 있다. 참고로 cursor는 find 메소드를 실행하여 얻어낸 결과의 집합이다.
db.컬렉션이름.find().count()
db.컬렉션이름.findOne()
한개만 출력
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처럼 배열 속에 데이터를 집어넣는다.
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"]}}
db.listingsAndRevies.find({"amenities":{"$size":20,
"$all":["internet","wifi","kitcen","heating",...]}},{"price":1,"address":1}).pretty()
이런 식으로 쿼리를 작성하면 price
와 address
필드만 커서에 포함된다.(0이면 해당 필드를 제외)
아래와 같은 식으로 작성하면, $elemMatch
로 지정한 배열 필드가 도큐먼트에 존재하고 조건에 맞는 요소가 있는 경우에만 해당 필드를 결과에 포함시킨다.
db.grades.find({"class_id":431},{"scores":{"$elemMatch":{"score":{"$gt":85}}}})
위의 elemMatch를 find의 query 조건에서 사용하면,
해당 조건을 만족하는 도큐먼트의 모든 필드를 불러온다.