[개발심화] NoSQL, MongoDB CRUD - 7주차 (1)

Hong·2022년 10월 29일
0


👨‍💻
본인이 당연히 이해하는 지식을 다른 사람이 이해하지 못한다고 하더라도 관용적인 태도를 가지고 천천히 설명해주는 사람이 있는 반면
왜 도대체 그렇게 기본적인 사실도 모르냐며 나무라는 사람이 있다
그런 사람들의 말 속에는 상대를 멍청하다고 생각하며 무시하고 업신여기는 감정이 들어있다
오히려 그런 유형의 사람들이 더 멍청하다 정서적 지능이 낮기 때문이다
본인이 본인 스스로에게 멍청하다고 말하는것 같아 웃음이 났다
앞으로도 열심히 사셨으면 좋겠다

그 분을 위해 좋은 읽을거리들고왔다


NoSQL이란 무엇인가?

NoSQL은 매우 넓은 범위에서 사용하는 용어로, 관계형 테이블의 레거시한 방법을 사용하지 않는 데이터 저장소를 말한다.


왜 NoSQL을 사용하는가?

  1. 비구조적인 대용량의 데이터를 저장하는 경우
    관계에 중점을 둔 SQL데이터베이스보다 자유로운 형태로 데이터를 저장할 수 있기 때문임
  2. 클라우드 컴퓨팅 및 저장공간을 최대한 활용하는 경우
    NoSQL 데이터베이스는 쉽게 분리가 가능하기 때문에 수평적 확장이 가능함
  3. 빠르게 서비스를 구축하고 데이터 구조를 자주 업데이트 하는 경우
    NoSQL은 SQL과 달리 스키마를 미리 준비할 필요가 없기 때문에 빠른 시간안에 프로토타입을 만들어 내야하는 프로젝트를 맡을 때 사용하게 된다. SQL은 데이터 구조를 업데이트 해야할 경우 매번 스키마를 수정해야하는 번거로움이 있기 때문에 빠르게 프로젝트를 만들어내야 할 때는 몽고디비를 사용하는 것이 적 합함


터미널에서 몽고디비를 homebrew로 설치하는 코드

brew install mongosh

터미널에서 atlas의 해당 클러스터에 접속하는 코드

(atlas 만드는방법은 따로 적지 않았지만 클라우드를 만들었고 atlas에서 제공하는 sample data를 받아왔다)

mongosh "mongodb+srv://cluster0.`여기는 블로그 올려서 가려줌니다`.mongodb.net/myFirstDatabase" --apiVersion 1 --username `여기에 atlas에서 사용하는 username들어감`

그럼이제 터미널에서 mongodb에 접속되었다

내가 들고 있는 database를 보고싶을 때 아래와 같이 적어준다

show dbs

이 중에서 내가 사용하고자 하는 database를 고를려면 아래와 같이 적어주면 된다

use 내가 사용하고자하는 database이름

이제 database가 선택되었다면 그 database안에 어떤 collections가 들어있는지 알고 싶다면 아래와 같이 적어주면 된다

***collections(mongoDB의 document 집합, document는 로컬에서 JSON형식으로 전달한 하나의 데이터 세트 단위임, document는 고유한 id값을 가진 JSON의 객체 형식으로 이루어져 있음)

show collections



📭
우리는 zips라는 collection으로 들어가보자
여기에는 미국의 우편번호 관련 데이터가 저장되어 있다



READ

🇺🇸
California 주의 우편번호 관련 데이터를 조회해보자
이때 find명령어가 들어간다
db.collection_name.find(<쿼리문>) 의 형식에 따라 데이터 조회(READ)를 위해 아래와 같이 적어주자

db.zips.find({"state" : "CA"})
{
    _id: ObjectId("5c8eccc1caa187d17ca6f360"),
    city: 'LOS ANGELES',
    zip: '90004',
    loc: { y: 34.076163, x: 118.302863 },
    pop: 64062,
    state: 'CA'
  },
  {
    _id: ObjectId("5c8eccc1caa187d17ca6f361"),
    city: 'LOS ANGELES',
    zip: '90001',
    loc: { y: 33.973093, x: 118.247896 },
    pop: 51841,
    state: 'CA'
  },
  {
    _id: ObjectId("5c8eccc1caa187d17ca6f362"),
    city: 'LOS ANGELES',
    zip: '90005',
    loc: { y: 34.058508, x: 118.301197 },
    pop: 35864,
    state: 'CA'
  },
  {
    _id: ObjectId("5c8eccc1caa187d17ca6f363"),
    city: 'LOS ANGELES',
    zip: '90007',
    loc: { y: 34.029442, x: 118.287095 },
    pop: 46985,
    state: 'CA'
  },
  {
    _id: ObjectId("5c8eccc1caa187d17ca6f364"),
    city: 'LOS ANGELES',
    zip: '90010',
    loc: { y: 34.060633, x: 118.302664 },
    pop: 5335,
    state: 'CA'
  }
...more

그러면 이렇게 JSON형식으로 출력 됨
🌴 우편번호 90004가 반갑다
이때 find명령어에 따른 실제 결과물은 화면에 출력된 것보다 훨씬 많지만 화면에는 랜덤하게 20개만 출력된다

근데 만약 캘리 주에 위치한 LA city의 우편번호만 보고 싶다면?

db.zips.find({"state" : "CA", "city" : "LOS ANGELES"})

그럼 zips컬렉션의 전체 데이터를 보고싶다면?

db.zips.find()

몇개 있는지 정확하게 알고싶다면

db.zips.find().count()

내가 원하는 정확한 하나의 값만 찾고 싶다면(id값을 이용해서 찾아야 함, 90004우편번호 하나의 값만 찾아보자)

db.zips.findOne({_id: ObjectId("5c8eccc1caa187d17ca6f360")})



UPDATE

updateMany : 쿼리문과 일치하는 모든 도큐먼트를 업데이트
updateOne : 주어진 기준에 맞는 다수의 도큐먼트 중 첫번째 도큐먼트 하나만 업데이트


updateMany

위에서 본 데이터에서 pop은 인구 수를 얘기한다(population)


이 데이터를 업데이트 해주기 위해서는 어떻게 해야할까?

$inc
$inc연산자를 통해 특정 필드의 값을 원하는 만큼 증가시킬 수 있다 나는 10을 적어줌으로써 LOS ANGELES의 pop필드값을 10만큼 증가시켜 줬다

db.zips.updateMany({"city" : "LOS ANGELES", {"$inc" : {"pop" : 10}}})
Atlas atlas-eh18gl-shard-0 [primary] sample_training> db.zips.updateMany({"city" : "LOS ANGELES"}, {"$inc" : {"pop" : 10}})
{
  acknowledged: true,
  insertedId: null,
  matchedCount: 56,
  modifiedCount: 56,
  upsertedCount: 0
}

matchedCount : 조건에 맞는 LOS ANGELES가 56개 있었고
modifiedCount : 56개의 데이터를 모두 수정함


updateOne

$set
updateOne을 써서도 데이터를 바꿀 수 있다(이때는 $set을 사용함, $inc를 사용하면 +- 계산을 해줘야하기 때문임 $set은 그냥 원하는 값을 바로 넣어줌)

Atlas atlas-eh18gl-shard-0 [primary] sample_training> db.zips.updateOne({"zip" : "90004"}, {"$set" : {"pop" : 50000}})
{
  acknowledged: true,
  insertedId: null,
  matchedCount: 1,
  modifiedCount: 1,
  upsertedCount: 0
}
Atlas atlas-eh18gl-shard-0 [primary] sample_training> db.zips.findOne({_id: ObjectId("5c8eccc1caa187d17ca6f360")})
{
  _id: ObjectId("5c8eccc1caa187d17ca6f360"),
  city: 'LOS ANGELES',
  zip: '90004',
  loc: { y: 34.076163, x: 118.302863 },
  pop: 50000,
  state: 'CA'
}

pop부분 보면 바뀐 것을 확인가능


$push
$push 연산자는 간단하게 말하자면, 배열로 이루어진 필드의 값에 요소를 추가하기 위한 연산자다.

Atlas atlas-eh18gl-shard-0 [primary] sample_training> db.grades.updateOne({"student_id" : 250, "class_id" : 339}, {"$push" : {"scores" : {"type" : "extra credit", "score" : 100}}})
{
  acknowledged: true,
  insertedId: null,
  matchedCount: 1,
  modifiedCount: 1,
  upsertedCount: 0
}
Atlas atlas-eh18gl-shard-0 [primary] sample_training> db.grades.find({"student_id" : 250})
[
  {
    _id: ObjectId("56d5f7eb604eb380b0d8e292"),
    student_id: 250,
    scores: [
      { type: 'exam', score: 3.6641013617826124 },
      { type: 'quiz', score: 16.099760154050923 },
      { type: 'homework', score: 18.069138737846245 },
      { type: 'homework', score: 66.16407292421133 },
      { type: 'extra credit', score: 100 }
    ],
    class_id: 339
  },
  ...more

scores의 필드 값인 배열에 type: 'extra credit' 요소가 추가된 것을 확인할 수 있다




DELETE

document를 삭제하는 방법
deleteMany : 쿼리문과 일치하는 모든 도큐먼트를 삭제
deleteOne : 주어진 기준에 맞는 다수의 도큐먼트 중 첫번째 도큐먼트 하나를 삭제

deleteMany


deleteOne


document가 아니라 collections를 삭제하고 싶다면?

db.collection_name.drop()




터미널에서 작업을 다 완료하고 mongodb서버에서 나갈려면 터미널에
exit쳐주면 됨

profile
Notorious

0개의 댓글