TIL(mongodb+CRUD+@)

On a regular basis·2021년 12월 15일
0
  • 혼자 정리해보는 TIL 꼬꼮꼮ㄲㄲ 기억하장 💪

왜 mongodb?

데이터베이스 왜쓰지?
데이터들은 휘발성이다. 프로그램이 꺼지만 데이터들이 다 날라가니까..
계속 저장&보관해주려면 db에..
프로그램(파일)은 데이터 용량이 제한적이다.
데이터와 데이터베이터시스템... 같이 움직임!
복수의 사용자가 자유롭고 편리하게 씀
RDBMS - sql <-> NoSQL(sql에서 지원하는 기능들을 거의 다 대체가능함)
데이터베이스가 백엔드에서 차지하는 중요성이 막강함!
스키마리스 -> NoSQL
sql -> 스키마가 다 있음. 스키마가 없을거란 걱정이 없음. 데이터 정렬, 분류 이런게 빨라 nosql에 비해서
-> 금융거래, 통계... 이런걸 도출해야할 때, 좋아!
-> 트랜젝션(중간에 끊겨도 -> 시작도 안함. 돈이 출금자체가 안되어있어)
-> 돈의 무결성 ( 총합 금액은 지키자 )
-> sql은 이 트랜젝션지원이 강력함!!!!!! 넘 중요행 ex.은행은 무조건 rdbms

(단점) 스키마 규격을 지켜야해서 짱나
컬럼(무결성을 지켜야하기때문에 값을 다 채워야해)... 무거워
부하의 분산이 쉽지않아!! 🔥

nosql -> (장점) 스키마가없음 -> 서비스 진입장벽이 낮아 -> 싫어요 에 대해서 앞으로 오는 애들만 예외처리를 하면됨.
-> 트래픽양이 많아짐에따라서... 페이스북...
-> 데이터 일관성 포기하고 얻는게 많음.
-> 트랜젝션 지원안해줌. 중간에 끊겨도 답이없음. 무결성은 존중안해줘
-> 장비 여러대로 부하를 처리하는 것 (상대적으로 쉽다)

(단점)스키마가 없음 규격화된 데이터를 갖기 힘들다
row = 유의미한 데이터한줄-> record <-> 도큐먼트(nosql)
-> db를 나눠서 저장하는 일은 굉장히 흔한일이다
양이 많아서일수도 있고 / 부하가 심해서 일수도있음(보통 이게 더 심함)
mongodb에는 autoincrement가 없음
mongodb에는 objectID라는게 있음! (ex.pk) : _id:ObjectID
mongodb에는 스키마리스 -> 문서가 2개가 있는데 a : 1, a : "1", a : , (a기준으로 정렬가능)

Index(mongodb)
-> 리스트나 복수자료형에 대한 Index가 가능함
pymongo만 일단...!
index 데이터를 미리 정렬시켜놓는 것! '미리'
정렬시켜놓는다? 뭘 기준으로?
컬럼에 대한 index를 생성해라.

복합인덱스 -> 여러 칼럼일때도 가능
데이터베이스에서 인덱스 확인 필!!!!
데이터베이스 접근할 때 조심스러운 마음으로 db 최대한 스트레스 안받게 해주는 것!
가능하면 Index는 적절하게*

(단점) index등록을 다 해줘야한다는 단점
성능을 어느 정도 포기하고 ... index를 줄임
read 와 write 두개를 잘 생각하고 설계를 해주어야 함!!!
안좋은 연산자들까지 다 확인해보기
hash의 블로그를... 다 보자 ^^

아무리 느린 쿼리라도 몇번에 한번 실행돼, 운영자들만 사용해. 그럼 상관없다
mongodb에 대해 익숙해져야한다 가장 먼저 !
테이블도 만들고..다해야하니까 !
mongodb & flask 같이 보기 (1-2주)

mongosh로 실습 🦖

> show dbs # 데이터베이스 목록 보기

> db # 현재 사용중인 db

> use <생성할 DB 이름>   # DB가 없다면 생성, 이미 있다면 접속

> db
imls

# db.createCollection("<생성할 콜렉션 이름>")   # 콜렉션 생성하기

> db.createCollection("imlmdb")  # 테이블 생성된 것
{ "ok" : 1 }

> show collections   # 콜렉션 리스트 출력
class
tok

# Create (insert)
> db.class.insert({"user_id":1, "name":"mimi"})
{
  acknowledged: true,
  insertedIds: { '0': ObjectId("61b982ddc4a0dfcb0cc67b66") }
}

>> db.class.insertMany([{"user_id":2, "name":"hash"},{"user_id":3,"name":"nex"},{"user_id":4,"name":"ria"}])
{
  acknowledged: true,
  insertedIds: {
    '0': ObjectId("61b9835ec4a0dfcb0cc67b68"),
    '1': ObjectId("61b9835ec4a0dfcb0cc67b69"),
    '2': ObjectId("61b9835ec4a0dfcb0cc67b6a")
  }
}

# Read (find)
> db.class.find({}) # 다 찾기
[
  {
    _id: ObjectId("61b982ddc4a0dfcb0cc67b66"),
    user_id: 1,
    name: 'mimi'
  },
  {
    _id: ObjectId("61b9835ec4a0dfcb0cc67b68"),
    user_id: 2,
    name: 'hash'
  },
  {
    _id: ObjectId("61b9835ec4a0dfcb0cc67b69"),
    user_id: 3,
    name: 'nex'
  },
  {
    _id: ObjectId("61b9835ec4a0dfcb0cc67b6a"),
    user_id: 4,
    name: 'ria'
  }
]

> db.class.find({"user_id":4})
[
  {
    _id: ObjectId("61b9835ec4a0dfcb0cc67b6a"),
    user_id: 4,
    name: 'ria'
  }
]

# Update
> db.class.update({"name":"ria"}, {$set:{"name":"ria", "age":22}})
# $set을 사용해주어야함!

{
  acknowledged: true,
  insertedId: null,
  matchedCount: 1,
  modifiedCount: 1,
  upsertedCount: 0
}

# 이후에 find로 찾아주면 update 된게 확인됨.

# Delete
> db.class.remove({"name":"mimi"})
{ acknowledged: true, deletedCount: 1 }
  • @
> db.class.find({"name":{$ne:"sophia"}})
# name이 sophia가 아닌 자료 찾기

> db.class.find({"user_id":{"$lt":4}})
# user_id가 4보다 작다

> db.class.find({"user_id":{"$lte":4}})
# user_id가 4보다 작거나 같다

> db.class.find({"user_id":{"$gt":4}})
# user_id가 4보다 크다

> db.class.find({"user_id":{"$gte":4}})
# user_id가 4보다 크거나 같다

> db.class.find({ $and: [{"user_id":{"$gte":3}}, {"name":"ria"}]})
# and 구문: user_id가 3보다 크거나 같으면서 and name이 ria인 자료 찾아줘
# 둘다 참이면 참, 하나라도 거짓이면 거짓(거짓이면 안나옴)

> db.class.find({ $or: [{ "user_id": { "$gte":6 } }, { "name": "ria" }] })
# or 구문: user_id가 6보다 크거나 같고 or name이 ria인 자료 찾아줘
# 하나라도 참이면 참, 둘다 거짓이면 거짓
  • 정렬하기
> db.class.find().sort({"user_id":1})
# 1이면 오름차순(1,2,3...)
# -1이면 내림차순(4,3,2,1...)

> db.class.find().sort({"name":1})
# 문자열도 1과 -1로 오름차순, 내림차순 가능

> db.class.find().limit(3)
# 3개만 보여줭

> db.class.find().sort({"name":1}).limit(2)
# sort랑 limit 같이 쓸수도있어
  • 특정 필드만 출력하기(Projection)
> db.class.find({},{_id:0,"user_id":1})
# 0은 나오게하지않을 필드, 1은 나오게할 필드

아.... sql.. nosql 뿌개버려야지..
아 재밌다 재밌다.. 주문을 외운다...^^ 💪

profile
개발 기록

0개의 댓글