[CS] MongoDB CRUD(Create, Read) Day-52

cptkuk91·2022년 1월 26일
0

CS

목록 보기
88/139

CREATE - insert 명령어

MongoDB Document 공통점, _id 필드를 기본값으로 반드시 가지고 있어야 합니다.

_id 필드의 값은 각 Document를 구별하는 역할을 합니다.

  • 내부의 필드와 값이 똑같다 해도, _id 값이 다르면 서로 다른 Document 가 됩니다.

  • Document 내 필드와 값이 달라도, _id 값이 같다면 서로 같은 Document 여겨 에러를 발생시킵니다.

따라서 각 Document 고유한 _id 값을 가지고 있어야 합니다.

Document 추가 시 _id 값을 특정하지 않았다면, 자동적으로 _id 필드가 생성되고 값에 ObjectId 타입이 할당됩니다.


MongoShell을 사용해 컬렉션에 새로운 Document 추가

터미널을 사용해 Atlas Cluster에 연결-!

insert

ex)

{
    "_id": ObjectId("5vjio32nio"),
    "city": "seoul",
    "zip": 14361,
    "loc": {
    	"x": 96.13464,
        "y"; 32.13463
    }
    "state": "KG"
}

insert를 이용하여 Document를 삽입하기 위해서는 shell에 작성된 것과 같이 insert()의 괄호 안에 삽입하고자 하는 Document를 작성합니다.

새로운 데이터를 insert했음에도 _id 값이 0일 경우, Document 추가에 실패했다는 것을 알 수 있습니다. (기존 데이터가 있을 경우 _id 값 증가가 안됐을 경우..)

writeError부분 duplicate key error는 이미 같은 _id값을 가지고 있는 Document가 존재하기 때문에 중복된 데이터를 삽입할 수 없다는 것을 의미합니다.


result

writeResult({"nInserted": 1}) 를 통해 zips collection 내 작성한 Document 삽입을 확인 할 수 있습니다.

_id를 통해 차이점을 확인할 수 있고, Document 삽입 시 자동적으로 해당 값 증가를 확인할 수 있습니다.

  • _id를 통해 Document가 구별된다는 것을 확인 가능

duplicate key error

document가 삽입될 때 배열 안의 리스트 된 순서대로 진행되기 때문에 _id값 중복이 생길 경우 Document 추가가 안된다.
(작업 순서 변경은 가능하다.)

[
    {“_id" : "1", "test": "1"},
    {"_id" : "1", "test": "2"},
    {"_id" : "3", "test": “3"}
]

위와 같이 "_id" 값이 "1" 중복으로 존재할 경우, duplicate key 에러를 발생시킨다.

  • 추가적으로, 3번 index의 경우 2번 index가 존재하지 않기 때문에 작업이 진행될 기회조차 오지 않습니다. 2번 index가 추가 된 후 collection에 추가됩니다.

존재하지 않는 collection에 Document를 추가한다면?

MongoDB는 사용자가 쉽게 새로운 Collection이나 DB를 생성하기를 원했습니다.

그래서 사용자가 존재하지 않는 Collection에 Document를 넣는 경우 그와 동시에 Collection이 생성됩니다.


READ - find 명령어

일정 조건에 따라 데이터를 조회하는 방법과 조회한 데이터의 수를 세는 방법

작업을 위해

show dbs

라는 명령어를 사용합니다.

위 명령어를 통해 database 목록을 볼 수 있고,

use sample_db

를 통해 사용하고자하는 데이터베이스를 입력하면 됩니다.

데이터베이스 접근 후

show collections

라는 명령어를 입력하면 데이터베이스 안에 존재하는 collection 리스트가 나타나는 것을 확인할 수 있습니다.

ex) 예를들어 zipc라는 collections에서 find 명령어를 통해 조건에 맞는 값을 검색하고 싶을 때

(데이터베이스이름).zips.find({"state": "NY"})

이미 use (데이터베이스이름) 을 입력한 경우에는 데이터베이스 이름을 특정해서 작성할 필요가 없습니다.

위 명령어를 입력할 경우 JSON 형식으로 화면에 출력되는 것을 확인할 수 있습니다.


find 조건을 여러개 적는 경우

ex) 조건을 find(<쿼리문1, 쿼리문2>) 형태로 적어주면 됩니다.

db.zips.find({"state": "NY", "city": "ALBANY"})
  • 모든 데이터를 보고 싶은 경우네는 find 명령어만 적고 쿼리문 없이 사용하면 됩니다.

findOne()을 사용하면 좀 더 구체적으로 데이터를 확인할 수 있습니다.

profile
메일은 매일 확인하고 있습니다. 궁금하신 부분이나 틀린 부분에 대한 지적사항이 있으시다면 언제든 편하게 연락 부탁드려요 :)

0개의 댓글