MongoDB server and command

# ysoftman
# C++ 로 개발된 확장가능하고, 고성능의 document-oriented DB
# MongoDB 자체는 오픈소스(GNU AGPL)이며 사업적 지원은 10gen이라는 회사를 통해 받을 수 있음
# MongoDB Driver 는 Apache 2.0
# RDBMS 의 대부분 index 지원
# 새로운 서버를 쉽게 추가하며, 자동 복구 기능
# Hadoop 의 MapReduce 같은 분산 병렬 처리 가능
# Windows, Linux, OS-X, Solaris 지원
# C, C++, Java, C#, Perl, Python, Ruby 지원
# 사용방법 : CLI(Command Line Interface) 쉘을 이용하거나 프로그램에서 API 를 이용하는 방법 제공
# 데이터모델
# 문서(Document) : 문서는 여러개의 필드,필드값 쌍을 가진 단위로 저장,삭제,수정 할 수 있음
# JSON 을 바이너리로 인코딩한 BSON 포맷으로 데이터 크기는 4MiB 로 제한
# 컬렉션(Collection) : RDB 의 테이블과 유사 개념으로, 네임스페이스로만 의미가 있음
# 데이터베이스(Database) : 컬레션을 관리하는 단위

# MongoDB 구성 하기
# 구성도 http://www.mongodb.org/display/DOCSKR/Introduction
# client(application) 은 router Server 에 접속해서 쿼리를 요청하면 된다.
# client 가 write 요청을 했다면 router 는 master mongodb 로, read 했다면 slave mongodb 로 안내한다.
# mongodb 서버에 1000을 더한 포트로 접속하면 MongoDB 모니터링 웹을 볼 수 있다.(http://127.0.0.1:56555)

# mkdir ysoftman_db_master
# mkdir ysoftman_db_slave
# mkdir ysoftman_db_config

# .lock 파일 삭제
rm -rfv ./ysoftman_db_master/*.lock
rm -rfv ./ysoftman_db_slave/*.lock
rm -rfv ./ysoftman_db_config/*.lock

# master mongoDB Server 시작하기
bin/mongod --master --dbpath ./ysoftman_db_master --port 10010 > /dev/null &

# slave mongoDB Server 시작하기(master 와 다른 장비에서)
#bin/mongod --slave --dbpath ./ysoftman_db_slave --port 10020 --source 10.10.10.100:10010 --autoresync > /dev/null &

# config mongoDB Server 시작하기
bin/mongod --dbpath ./ysoftman_db_config --port 10001 > /dev/null &

# router Server 시작하기
bin/mongos --port 10000 --configdb 10.10.10.100:10001 > /dev/null &

# router Server 접속해서 Sharding 하기
bin/mongo 10.10.10.100:10000

# 참고로 mac 에서 mongo cli 설치 후
brew tap mongodb/brew
brew install mongodb-community-shell

# 원격 접속하기
mongo "mongomongodb://root:ysoftman@10.10.10.10.200:9300/admin?connectTimeoutMS=10000&authSource=admin&authMechanism=SCRAM-SHA-1"

# SQL to mongo mapping chart
# http://www.mongodb.org/display/DOCS/SQL+to+Mongo+Mapping+Chart

# MySQL term   Mongo term
# database database
# table collection
# index index
# row BSON document
# 하나의 document 최대 크기 16MB

# admin db 를 사용해서 설정해야 한다.
use admin;

# shard 추가하기, router 랑 같은 머신의 shard 를 사용할 수 있도록 옵션 명시
# 실제 사용시에는 router 랑 다른 머신의 shard 를 사용해야 한다.
db.runCommand({addshard:"10.10.10.100:10010", allowLocal:true});

# database 단위에서 sharding enable 하기
db.runCommand({enablesharding:"testdb"});

# col1 collection 의 _id 별로 자동 분산되어 저장하도록 하기
db.runCommand({shardcollection:"testdb.col1", key:{"_id":1}});

# sharding 상태확인
db.printShardingStatus();

# shard 삭제하기
db.runCommand({removeshard:"10.10.10.100:10010"});

# testdb 사용하기(DB 를 미리 생성하지 않는다.)
use testdb

# routerinfo 콜렉션 생성
db.createCollection("routerinfo");

# 예) JSON 형식으로 정보 추가
db.routerinfo.save(
{
  "id": "1234",
  "name": "ysoftman",
  "timestamp": 12345,
  "userkey": "UserNo",
  "metainfo": {
    "list": [
      { "name": "UserNo", "desc": "사용자", "type": "int" },
      {
        "name": "Item",
        "desc": "아이템",
        "list": [
          { "name": "a", "desc": "아이템1" },
          { "name": "b", "desc": "아이템2" }
        ]
      },
      { "name": "phone", "desc": "전화번호", "type": "int" },
      { "name": "name", "desc": "이름" },
      { "name": "trash", "desc": "쓰레기" },
      {
        "name": "Map",
        "desc": "맵",
        "pk": "MapID",
        "array": [
          { "name": "MapID", "desc": "맵번호", "type": "int" },
          { "name": "MinScore", "desc": "최소점수", "type": "int" },
          { "name": "MaxScore", "desc": "최대점수", "type": "int" }
        ]
      }
    ]
  }
}
);


#####


# mongo cli 예시
# 도움말
help()

# Database 목록보기
show dbs

# testdb 사용하기(DB 를 미리 생성하지 않는다.)
use testdb

# 현재 사용중인 DB 확인
db.getName()

# 현재 Databse 컬렉션 보기
show collections

# 크기 제한 설정하여 컬레션 생성 size: 크기, max: 최대 개수
#db.createCollection("col1", {capped:true, size:100000, max: 1000});
db.createCollection("col1");

# 컬렉션 이름이 숫자로 시작하거너 - 이 있으면
db["1234"] 또는 db.getCollection("aaa-bbbb")
# 위 해당 사항이 아니라면 다음과같 간단히도 사용할 수 있다. 
db.col1

# 컬렉션 상태 보기
db.col1.validate()

# col1 켈렉션 자체 삭제하기
db.col1.drop()

# col1 컬렉션 모든 document 삭제
db.col1.remove({})

# col1 컬렉션에스 쿼리에 해당하는 document 만 삭제
db.col1.remove({_id:"123"})

# col1 라는 컬렉션에 Name, URL, LastUpdate 등의 데이터를 저장하기(insert() or save())
db.col1.save({UserNo:0, Map:[{MapID:1, Score:100}, {MapID:2, Score:200}]});

# col1 의 다큐먼트 개수 파악하기
db.col1.count()

# col1 의 모든 다큐먼트 검색하기
db.col1.find()

# col1 의 모든 다큐먼트 검색하기(들여쓰기하여 출력)
db.col1.find().pretty()

# UserNo 가 555 인 다큐먼트 찾기
db.col1.find({UserNo:555})

# UserNo 가 555 인 다큐먼트를 찾아서 Map.MapID 필드만 보여주기
db.col1.find({"UserNo":555}, {"Map.MapID":1});

# UserNo 가 555 인 다큐먼트를 찾아서 _id 는 제외하고 Map.MapID 필드만 보여주기
db.col1.find({"UserNo":555}, {_id:0, "Map.MapID":1});

# col1 의 모든 다큐먼트 검색하기(_id 로 오름차순 정렬로 보여주기 -1이면 내림차순)
db.col1.find().sort({_id:1})

# Map.MapID 의 값이 10 인 다큐먼트 개수
db.col1.find({"Map.MapID":10}).count()

# Map.MapID 의 값이 100 보다 큰거나 같은 다큐먼트 개수
db.col1.find({"Map.MapID":{$gte:100}}).count()

# UserNo 가 555 이고 Map 배열의 첫번째 MapID 값을 1234 로 변경하기(조건에 해당하는 내용이 없으면 다큐먼트 하나가 추가된다)
db.col1.update({"UserNo":555}, {$set:{"Map.0.MapID":1234}}, true);

# UserNo 가 555 이고 Map 배열의 100번째 MapID 값을 삭제하기
db.col1.update({"UserNo":555}, {$unset:{"Map.100.MapID":1}});

# UserNo 가 555 이고 Map 배열중 MapID 가 2인 곳을 찾아내어 123 값으로 설정한다.
db.col1.update({UserNo:555, "Map.MapID":2}, {$set:{"Map.$.MapID":123}})

# UserNo 가 555 이고 Map 배열에 object 추가(array 필드에 대해서만 사용할 수 있다)
db.col1.update({UserNo:555}, {$push:{Map:{"MapID":333, "MinScore":300, "MaxScore":500}}})

# 현재 컬렉션의 데이터 하나 삭제하기(검색 결과 id로 지운다)
db.col1.remove({_id:ObjectId("4d5a1ad2e812000000000515")})

# 현재 컬렉션의 모든 document 삭제
db.col1.remove({})

# 인덱스 생성(1:ascending, -1:descending)
db.col1.ensureIndex({"UserNo":1});

# 현재 인덱스 확인(db.system.indexes.find() 전체 인덱스 확인)
db.col1.getIndexes()

# 인덱스 삭제
db.col1.dropIndexes()

# db 상태 확인(data, index 사이즈 등...)
db.stats();

# 서버 상태 확인
db.serverStatus()
db.serverStatus().mem
db.serverStatus().extra_info

# 클라이언트 종료
exit

comments:

댓글 쓰기