처음 mongodb

13698 단어 MongoDB

시작



docker로 mongodb와 데이터 뷰어의 mongo-express 2개를 기동시킵니다.
version: '3.1'

services:

  mongo:
    image: mongo
    restart: always
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: example

  mongo-express:
    image: mongo-express
    restart: always
    ports:
      - 8081:8081
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: root
      ME_CONFIG_MONGODB_ADMINPASSWORD: example

htps : // 후 b. 도 c r. 코 m/_/몬고

시작
docker-compose up -d

mongodb와 mongo express의 두 컨테이너가 시작됩니다.
# docker ps | grep mongo
b8f3154dda29        mongo-express                               "tini -- /docker-ent…"   34 minutes ago      Up 33 minutes       0.0.0.0:8082->8081/tcp           mongo_mongo-express_1
06e8e28840bb        mongo                                       "docker-entrypoint.s…"   35 minutes ago      Up 33 minutes       27017/tcp                        mongo_mongo_1

mongo-express



mongo-express는 이런 URL에서 볼 수 있습니다.
http://localhost:8081/

이런 식으로 문서를 브라우저에서 열람 가능합니다 (데이터는 이 기사의 ↓쪽으로 insert한 것입니다)


csv에 내보내는 편리한 것처럼.


데이터 변경도 가능합니다! 멋지다.


CLI 연결


# コンテナに入る
docker exec -it mongo_mongo_1 bash

# cli起動
root@06e8e28840bb:/# mongo -u root -p example
...
...
...
>

연결할 수 있었습니다. username/password는 MONGO_INITDB_ROOT_USERNAME/PASSWORD 로 설정한 것입니다.

사용해보기



신기사를 따라, 소중한 곳을 뽑아 봅니다.

MongoDB 초입문
htps : // 이 m / 고등어 1024 / ms / f2 아 d56f2 아 3 바 7 아 f8521

놀랍게도 database를 만드는 것은 매우 간단합니다.
> use study

create가 아닌가! use만으로 만들어진다. 멋지다! !

데이터를 넣으면서 선택해 보겠습니다.
> db.stats()

# records 登録
db.user.insert({name:'mr.a', age:10, gender:'m', hobbies:['programming']});
db.user.insert({name:'mr.b', age:20, gender:'m', hobbies:['vi']});
db.user.insert({name:'ms.c', age:30, gender:'f', hobbies:['programming', 'vi']});
db.user.insert({name:'ms.d', age:40, gender:'f', hobbies:['cooking']});

# select * from study
> db.user.find()

# where
 db.user.find( {name:'ms.c'} )

配列(not dict) は文字列のように検索できる
> db.user.find({hobbies:'programming'})
{ "_id" : ObjectId("5ee1a837b84ea8cc6e82073f"), "name" : "ms.c", "age" : 30, "gender" : "f", "hobbies" : [ "programming", "vi" ] }

update 문



MongoDB의 update는 두 번째 인수로 전달한 내용으로 덮어쓰기합니다.
이거는 함정입니다. 매우 위험한 함정입니다.
これが
{ "name" : "mr.a", "age" : 10, "gender" : "m", "hobbies" : [ "programming" ] }

updateすると
db.user.update({name:'mr.a'}, {gender:'X'})

こうなっちゃう
{ "gender" : "X" }

NoSQL 있다.

실은 이것, mr.a씨의 성별을 갱신했다고 하는 것보다, 이름이 mr.a라고 하는 문서를 gender:X라고 하는 문서로 덮어썼다고 하는 것이 됩니다.

덮어쓰기보다는 대체한 느낌.

그럼 어떻게 하는 거야. . . 라고 하는 이야기입니다만, 그 때문에, $set 라고 하는 수식자를 이용할 필요가 있습니다.
본래는, $set를 사용해 이하와 같이 할 필요가 있었던 것입니다.
> db.user.update({name:'mr.a'}, {$set:{gender:'X'}})

elasticsearch보다 간단할지도. NoSQL계는 모두 이런 것일까. update 귀찮고 싫어 버린다.

그리고 이 update에도 함정이 있다.

이것이라면 MongoDB가 처음 찾은 하나만 업데이트됩니다.
동시에 2건 이상의 해당 레코드를 단번에 갱신하려면, 제4 인수에 true를 건네주어야 합니다.
> db.user.update({}, {$set:{gender:'X'}}, false, true)

처음 보기 죽이는거야・・・

upsert



upsert구는 존재하지 않고, update의 제3 인수를 true라고 하는 유감스러운 사양인것 같다. 어느 정도 좋지만
> db.counter.update( {type:'error'} ,{$inc:{count:1}}, true)

컬럼 추가



오늘 알고 싶었던 것은 여기. elasticsearch처럼 라쿠에 컬럼 추가할 수 있을까 라고. 결론 : elasticsearch보다 더 쉽게!

상당히 중요한 점이라고 생각합니다만, MongoDB에서는, RDBMS와 달리 간단하게 필드(컬럼, 열)의 추가를 할 수 있습니다.
이것은 컬렉션(테이블) 자체에 필드 정보가 정의되어 있는 것은 아니고, 어디까지나 문서(레코드, 행) 단위에 필드 정보가 보관 유지되고 있기 때문입니다.

응? ?

문서 (레코드, 행) 단위로 필드 정보가 유지되기 때문입니다.
문서 (레코드, 행) 단위로 필드 정보가 유지되기 때문입니다.
문서 (레코드, 행) 단위로 필드 정보가 유지되기 때문입니다.

마술! ! ! ! 원래 컬럼이라는 생각이 없는 것인가. 모든 레코드 독립적입니까? 굉장해! ! ! ! !

공부가 되었습니다! ! 사용해 보자!

좋은 웹페이지 즐겨찾기