2014-11-13 2 views
0

사전 집계 보고서에 대한 공식 MongoDB 문서 (http://docs.mongodb.org/ecosystem/use-cases/pre-aggregated-reports/)를 따르고 있습니다.MongoDB 사전 집계 보고서의 스키마 디자인

{ 
    _id: "20101010/site-1/apache_pb.gif", 
    metadata: { 
    date: ISODate("2000-10-10T00:00:00Z"), 
    site: "site-1", 
    page: "/apache_pb.gif" }, 
    hourly: { 
    "0": 227850, 
    "1": 210231, 
    ... 
    "23": 20457 }, 
    minute: { 
    "0": { 
     "0": 3612, 
     "1": 3241, 
     ... 
     "59": 2130 }, 
    "1": { 
     "0": ..., 
    }, 
    ... 
    "23": { 
     "59": 2819 } 
    } 
} 

것은 내가 현재이 방법을 사용하고 있다는 것입니다, 나는 이미 이런 방식으로 저장된 일부 데이터를 가지고 : 튜토리얼에 따르면, 사전 집계 문서는 다음과 같아야합니다. 하지만 이제 메타 데이터 하위 문서에 다른 차원을 추가하려고합니다. 전체 내용을 다시 고려했습니다.

제 질문은 메타 데이터 속성에 저장된 동일한 정보로 _id 속성을 빌드해야 할 이유가 있습니까? 메타 데이터 주위에 복합 색인 (고유)을 작성하고 _id 키에 대해 ObjectId를 사용하기에 충분하지 않습니까?

감사합니다.

+1

네을 (인덱스에 대해 잊지 마세요) 좋은의 preformance 복잡한 데이터 모델없이 더 간단하고 관리 솔루션, 즉 잘 될 것입니다. '_id'는 여기에있는 것처럼 URI 세그먼트와 정확히 일치하기 때문에 편의를 위해있는 것처럼 보입니다. – wdberkeley

답변

0

다른 방법)

당신은 간단한 컬렉션을 만들 수 있습니다

이 컬렉션은 어떤에 의해 삽입

및 골재와 (복잡한 집계 쿼리를 사용하는 방법에 대한 매우 좋은 성능을 가지고있을 것입니다

{ 
    "ts": "unix timestamp", 
    "site": "site-1", 
    "page": "/apache_pb.gif" 
} 
시간대 곡물) :

db.test.aggregate(
[ 
    { 
    "$project": { 
     "ts": 1, 
     "_id": 0, 
     "grain": { 
     "$subtract": [ 
      { 
      "$divide": [ 
       "$ts", 
       3600 
      ] 
      }, 
      { 
      "$mod": [ 
       { 
       "$divide": [ 
        "$ts", 
        3600 
       ] 
       }, 
       1 
      ] 
      } 
     ] 
     }, 
     "site": 1, 
     "page": 1 
    } 
    }, 
    { 
    "$group": { 
     "_id": { 
     "site": "$site", 
     "page": "$page", 
     "grain": "$grain", 
     } 
    } 
    }, 
    { 
    "$group": { 
     "tsum": { 
     "$sum": 1 
     }, 
     "_id": { 
     "grain": "$_id.grain" 
     } 
    } 
    }, 
    { 
    "$project": { 
     "tsum": "$tsum", 
     "_id": 0, 
     "grain": "$_id.grain" 
    } 
    }, 
    { 
    "$sort": { 
     "grain": 1 
    } 
    } 
]) 

이 예

이럴에서 3600 초 - - 네브라스카 시간이이

+0

음, 메타 데이터 하위 문서에 차원을 넣는 것이 좋은 이유는 메타 데이터에 고유 인덱스를 추가 할 수 있다는 것입니다. 그런 다음 인덱스를 수정하지 않고 임의의 차원을 추가 할 수 있습니다. – iuri

+0

또한 ISODate 개체 및 날짜 집계 연산자 http://docs.mongodb.org/manual/reference/operator/aggregation-date/를 사용하여 여러 기간으로 통계를 집계 할 수 있습니다. 어떤 방법이 더 효율적인지는 모르겠다. – iuri

+0

이 게시물에서는 필드 계산을 위해 $ project 문을 사용하여 다른 기간으로 데이터를 집계하는 방법을 설명하려고합니다. –