몽고DB 정리도 여기 저기 잘 되어 있지만, 내가 쓰는 커맨드, 설치했던 방법들을 모아 모아서 소소하게 정리해 둔다. ubuntu 16.04에서 설치하고, systemd
에 등록하는 것도 매우 유용 했다.
공식 사이트에 가면 14.04 버전 설치 방법만 나와있는데, 크게 다르진 않지만...
https://www.digitalocean.com/community/tutorials/how-to-install-mongodb-on-ubuntu-16-04
$sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927
$echo "deb http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.2 multiverse" | sudo tee etc/apt/sources.list.d/mongodb-org-3.2.list
$sudo apt-get update
$sudo apt-get install -y mongodb-org
$sudo vim /etc/systemd/system/mongodb.service
/etc/systemd/system/mongodb.service
파일 내용을 아래와 같이 작성
[Unit]
Description=High-performance, schema-free document-oriented database
After=network.target
[Service]
User=mongodb
ExecStart=/usr/bin/mongod --quiet --config /etc/mongod.conf
[Install]
WantedBy=multi-user.target
아래 커맨드로 컨트롤.
sudo systemctl enable mongodb
sudo systemctl start mongodb
sudo systemctl stop mongodb
sudo systemctl status mongodb
바다 건너있는 내 서버에 접속하는 방법
계정은 Database의 계정이다.
$mongo -u <user_name> -p <password> <host>:<port>[/DB_Name]
MongoDB DB 당 하나의 계정만을 갖으며, 필요하다면 DB마다 계정을 만들어야 된다.
>db.createUser({ user: "msalt", pwd: "jjang", roles: ["dbAdmin", "readWrite"]});
sudo vi /etc/mongod.conf
에서 변경해줌. bind_ip
를 주석처리하면 모든 IP를 허용
컬렉션 별로 export, 또는 adminMongo 에서도 export 가능. 하지만 아직 사용해본 적은 없다. dump를 더 많이...
$mongoexport --db test --collection traffic --out traffic.json
말그대로 통째로 dump 뜬다. 스크립트 돌려서 백업도 이걸로 하고 있다.
$mongodump -d <database_name> -o <directory_backup>
$mongorestore -d <database_name> <directory_backup>
MongoDB shell은 자바스크립트를 사용하듯이 사용하면된다. 다만, console.log
대신 print
와 printjson
을 사용해야 한다.
The mongo shell is an interactive JavaScript interface to MongoDB. You can use the mongo shell to query and update data as well as perform administrative operations.
여러 방법이 있겠지만, 자바스크립트를 사용하듯이 shell에서 아래와 같이 단순한 방법으로 찾는 문자열이 포함된 부분을 화면에 출력할 수 있다.
db.collection.find().forEach(function(item){
var keyword = '/resource/'; //찾고자 하는 문자열
var length = keyword.length;
var string = item.field;
var substring = '';
if (!string)
return;
var index = string.indexOf(keyword);
while (index != -1) {
substring = string.substring(index, index + 50);
string = string.substring(index+length);
print(substring);
index = string.indexOf(keyword);
}
});
상대 경로로 저장되어 있던 리소스의 url을 S3로 바꾸면서 DB에 있는 내용을 모두 바꿔야 해서 사용했던 명령문이다. SQL만 사용하다가 이렇게 사용해보니 완전 기분이 색다르다.ㅋ
db.collection.find().forEach(function(item){
var keyword = '/resource/';
var replacement = 'https://s3-us-west-1.amazonaws.com/example/resource/';
if (!item.field)
return;
item.field = item.field.replace(keyword, replacement);
db.collection.save(item);
});
test 데이터베이스로 이동할때
>use test
데이터베이스 목록 출력
>show dbs
데이터베이스 상태확인
>db.stats()
데이터베이스 shutdown
admin 영억으로 이동후에 셧다운 해야함.
>use admin
>db.shutdownServer()
데이터베이스 로그아웃
>db.logout()
데이터베이스 삭제
>use db, and db.dropDatabase()
collection 생성capped
옵션으로 사이즈를 고정 할 수 있으며, 초과되는 데이터는 overwrite 된다.
>db.createCollection("emp",{capped:false, size:8192});
colection list보기
>show collections
collection의 현재상태 및 정보분석
>db.emp.validate();
collection의 이름변경
>db.emp.renameCollection("employee")
Collection의 삭제
>db.employee.drop();
collection에 데이터 INSERT
>db.emp.insert({eno:1101,name:"JIMMY"});
collection에 데이터 UPDATE
첫번째 인자는 일치 조건이고, 두번째는 업데이트할 값, 세번째는 옵션이다.
>db.emp.update({eno:1101, age: { $lte: 20 }}, {$set:{fname:"JOO"}, {multi: false}});
collection에 데이터 SELECT
인자가 없으면 모든 documents 조회한다. 메서드 체이닝으로 정렬도 가능하다.
>db.emp.find({url:"msalt.net"});
>db.emp.find().sort({eno:-1});
>for(var n=1103; n<=1120; n++) db.things.save({n:n, m:"test"+n})