mongo 클라이언트에서 json을 사용할 때, 키에 대해서는 "(double quotation 또는 single quotation)을 쓰지 않아도 되지만, value에 대해서는 숫자가 아닌 문자열일 때는 "을 사용하는 것이 좋다. (물론 경험상으로..)


아래와 같은 코드로 google 의 _id가 gg_11인 콜렉션을 삭제하고 싶다는 명령어를 내릴 수 있다. 데이터가 있지만, 삭제를 실패한다.


replset:PRIMARY> db.google.remove( { _id:gg_11 })

2015-09-30T17:09:11.768+0900 E QUERY    ReferenceError: gg_11 is not defined

    at (shell):1:32



double quotation(또는 single quotation)을 사용하니 동작한다.


replset:PRIMARY> db.google.remove( { _id:"gg_11'"})

WriteResult({ "nRemoved" : 1 })


Posted by '김용환'
,


mongodb의 /etc/mongodb.conf 설정시 space 또는 tab을 잘 정렬하지 않으면 설정 에러로 mongdb가 시작못하는 경우가 발생할 수 있다.


아래와 같은 설정으로 정상적으로 mongod 프로세스를 시작할 수 있다.

replication:

  oplogSizeMB: 10240

  replSetName: "replset"


operationProfiling:

  mode: slowOp

  slowOpThresholdMs: 200



그러나, 아래와 같은 설정을 주면 mongod 에러가 발생하고 실행이 되지 않으니. 잘 신경쓸 필요가 있다.

replication:

  oplogSizeMB: 10240

  replSetName: "replset"


  operationProfiling:

    mode: slowOp

    slowOpThresholdMs: 200


mongod -f /etc/mongod.conf

Unrecognized option: replication.operationProfiling.slowOpThresholdMs

try '/usr/local/mongodb/bin/mongod --help' for more information



Posted by '김용환'
,



mongodb에서 slow query 로그를 출력할 수 있다. /etc/mongod.conf에 다음을 추가해야 한다.


operationProfiling:

  mode: slowOp

  slowOpThresholdMs: 100




slowOpThresholdMs의 디폴트 값은 100ms 이다.


mode의 디폴트값은 off이다. 

mode가 off 라면, 전혀 프로파일링 하지 않음

slowOp라면, 오직 slow 명령어에 대해서만 프로파일링한다.

on이라면, 모든 명령어에 대해서 프로파일링한다.



mongo 클라이언트에서 profile status를 확인할 수 있다.


replset:PRIMARY> db.getProfilingStatus()

{ "was" : 0, "slowms" : 100 }


위에 profile설정 (/etc/mongod.conf)를 수정하고 난 후, 재시작하고 mongo 클라이언트로 접속해서 profile status를 확인한다.


replset:PRIMARY> db.getProfilingStatus()

{ "was" : 1, "slowms" : 200 }



mongo 클라이언트에서 동적으로 profile level을 수정할 수 있다.


> db.setProfilingLevel(0,20)

> db.setProfilingLevel(0)




참고 

http://docs.mongodb.org/manual/reference/configuration-options/

http://docs.mongodb.org/manual/tutorial/manage-the-database-profiler/

Posted by '김용환'
,


mongodb는 ttl(생명 주기)를 두가지 방식으로 설정할 수 있다.


1. collection 단위로 ttl을 주어, collection에 저장되는 모든 document에 ttl이 자동으로 설정되게 한다.


아래 예제는 local db 밑에 location이라는 collection을 생성 후, 60초 뒤에 자동삭제를 하도록 한다. 


$ mongdb


replset:PRIMARY> use local

replset:PRIMARY> db.location.createIndex( { "createdAt": 1 }, { expireAfterSeconds: 60 } )

replset:PRIMARY> db.location.insert( {

   "createdAt": new Date(),

   "id": 1,

   "url" : "http://map.google.com/12312"

} )




2. document 단위로 ttl을 준다.


아래 예제는 local db 밑에 google이라는 collection을 생성 후, 다큐먼트가 2015년 9월 22일 14시에 자동삭제를 하도록 한다. index 생성시 expireAfterSeconds는 expireAt시간 이후의 삭제할 시간을 명세할 수 있다. 


replset:PRIMARY> use local

replset:PRIMARY>  db.google.createIndex( { "expireAt": 1 }, { expireAfterSeconds: 0 } )

replset:PRIMARY>  db. google.insert( {

   "expireAt": new Date('9 22, 2015 14:00:00'),

   "id": 2,

   "url": "http://map.google.com/12313"

} )


자바의 mongo-jpa를 이용해서 구현할 때, class를 다음과 같이 디자인하여 expireTiime을 두어 TTL을 가진 캐시 item을 생성할 수 있다. 

@JsonIgnoreProperties(ignoreUnknown = true)
public class Google {
@Id
private String id;
private String url;
private Date expireAt = DateUtils.addMinutes(new Date(), 1); // getter, setter }


또한 터미널에서 실제 데이터가 언제 데이터가 사라지는지 확인하기 위한 방법은 두가지가 있다.

1. db.collection.find()를 수동으로 실행하면서 체크하기

2. 자바 스크립트로 데이터가 확인하기


// 아무 것도 없으면 그냥 종료

replset:PRIMARY> var startDate = new Date(); while (true) { var count = db.location.count(); print ("Documents : " + count + "( " + (new Date() - startDate) + " ms)"); if (count == 0) break; sleep(5000); }

Documents : 0( 1 ms)


// 1분뒤에 삭제되는 데이터 추가

replset:PRIMARY> var startDate = new Date(); while (true) { var count = db.googleLocation.count(); print ("Documents : " + count + "( " + (new Date() - startDate) + " ms)"); if (count == 0) break; sleep(5000); }

Documents : 1( 1 ms)

Documents : 1( 5002 ms)

Documents : 1( 10003 ms)

Documents : 1( 15004 ms)

Documents : 1( 20004 ms)

Documents : 1( 25005 ms)

Documents : 1( 30006 ms)

Documents : 1( 35007 ms)

Documents : 1( 40008 ms)

Documents : 1( 45009 ms)

Documents : 1( 50009 ms)

Documents : 1( 55010 ms)

Documents : 1( 60012 ms)

Documents : 1( 65013 ms)

Documents : 1( 70014 ms)

Documents : 1( 75015 ms)

Documents : 1( 80016 ms)

Documents : 1( 85017 ms)

Documents : 1( 90018 ms)

Documents : 1( 95019 ms)

Documents : 1( 100019 ms)

Documents : 0( 105020 ms)






* 주의할 점

collection 단위로 ttl을 줄 때는 "createdAt"(과거형)이고, document 단위는 "expireAt" (현재형)이다. 

expiredAt 이 아님..







참고

http://docs.mongodb.org/manual/tutorial/expire-data/

http://www.codeproject.com/Tips/467689/MongoDB-Time-To-Live-TTL-Collections

Posted by '김용환'
,