2011-04-19 5 views
15

MongoDB를 사용하여보기 및 클릭과 같은 많은 양의 분석 데이터를 저장할 계획입니다. 쿼리를 돕고 데이터베이스 크기를 줄이기 위해 MongoDB 내에서 문서를 구조화하는 가장 좋은 방법은 확신 할 수 없습니다.MongoDB 대량의 메트릭/분석 데이터 저장 방법

우리는 페이지 이름, 클라이언트 및 동작 유형을 다시 기록해야합니다. 이상적으로 우리는 년/월/일/시간 단위로 내려가는 통계가 필요합니다. 우리는 초당 또는 분당 뷰를 필요로하지 않습니다. 이 문서 구조는 괜찮아 보이지만, 나는 100 명의 새로운 문서를 생성 할 수 있다는 것을 알고 있습니다.

{ 
    "_id" : ObjectId("4dabdef81a34961506040000"), 
    "pagename" : "Hello", 
    "action" : "view", 
    "client" : "client-name", 
    "time" : Date("Mon Apr 18 07:49:28 2011") 
} 

이 일의 가장 좋은 연습 방법 중 하나 $inc 또는 Capped Collections을 사용 있나요?

답변

15

업데이트되는 응답 몽고 쉘에서 함께 해킹

:

use pagestats; 

// a little helper function 
var pagePerHour = function(pagename) { 
    d = new Date(); 
    return { 
     page : pagename, 
     year: d.getUTCFullYear(), 
     month: d.getUTCMonth(), 
     day : d.getUTCDate(), 
     hour: d.getUTCHours(), 
    } 
} 

// a pageview happened 
db.pagestats.update(
    pagePerHour('Hello'), 
    { $inc : { views : 1 }}, 
    true); //we want to upsert 

// somebody tweeted our page twice! 
db.pagestats.update(
    pagePerHour('Hello'), 
    { $inc : { tweets : 2 }}, 
    true); //we want to upsert 

db.pagestats.find(); 
// { "_id" : ObjectId("4dafe88a02662f38b4a20193"), 
// "year" : 2011, "day" : 21, "hour" : 8, "month" : 3, 
// "page" : "Hello", 
// "tweets" : 2, "views" : 1 } 

// 24 hour summary 'Hello' on 2011-4-21 
for(i = 0; i < 24; i++) { 
    //careful: days (1-31), month (0-11) and hours (0-23) 
    stats = db.pagestats.findOne({ page: 'Hello', year: 2011, month: 3, day : 21, hour : i}) 
    if(stats) { 
     print(i + ': ' + stats.views + ' views') 
    } else { 
     print(i + ': no hits') 
    }; 
} 

따라 어떤 측면에 당신이 (사용자 중심의 추적을위한 예를 들면 모음 더 컬렉션을 추가하는 것이 좋습니다 추적 할). 희망이 도움이됩니다.

더 많은 공간을 추가하는 것은 합리적으로 싼 것, 또한

Blogpost about Analytics Data

+0

지난 시간 동안 매 시간마다 'Hello'에 대한 조회수를 표시하고 싶다면 find() 구문은 어떻게 생겼을까요? – Tom

+0

..이 솔루션은 정확히 이상적이지 않을 것입니다. 그러나 잠깐 만요, 나는 업데이 트를 게시 할게. – Matt

+0

그 사이에 http://cookbook.mongodb.org/patterns/unique_items_map_reduce/ – Matt

1

나는, 몽고 거의 무한하게 그런 측면에서 확장 할 수있는 공간에 대한 걱정을 너무 많이하지 않을 참조하십시오.

문서를 계속 업데이트하면 크기가 커지므로 결국 Mongo는 색인에서 새로운 위치를 찾아야합니다. 문서가 많이 업데이트되고 크기가 커지면 Mongo가이 문서를 많이 복사해야 할 필요가 있습니다. 이로 인해 작업 속도가 크게 느려질 수 있습니다. 물론이 모든 것은 예상 트래픽 양에 달려 있습니다.

내 경험에 비추어 볼 때, 문서를 업데이트 할 필요가없는 간단한 문서 형식으로 이동하면 나중에 쿼리가 복잡해질 수 있지만 map/reduce를 사용하면 원하는 위치에 관계없이 원하는 정보를 얻을 수 있습니다. 문서 구조 (지도 축소는 매우 유연하므로 충분한 경험을 통해 무엇이든 할 수 있습니다).

관련 문제