2014-12-23 4 views
1

내가 몇 가지 채점을 추출하기 위해 메시지를 표시 할 수 있도록 일부 로그 항목 (50^6)이있는 콜렉션이 있다고 가정 해 보겠습니다.pymong 그룹 및 카운트

다음은 내 컬렉션에있는 문서 중 하나의 예입니다. 난 그냥 관련 정보

다양한 PRG 5 월이 하나 개의 패키지 나는 informatin 다음 패키지/버전의 주어진 몇 추출 할 abble 싶습니다

에 관한

{ 
    'prg': 'blastall', 
    'uid': '7225', 
    'version': '2.2.21', 
    'date': datetime.datetime(2013, 12, 1, 0, 0), 
    '_id': ObjectId('54948dbdff4346034c23ae8d'), 
    'pack': 'blast' 
} 

메모를 떠났다. 이 패키지/버전 사용 된 음식물의 목록을 사용하는 UID의 수집 목록에 ocuurences의 NB는

현재 나는 이런 식으로 일을.

satrt, end는 처리 할 기간을 제한하는 datetimes입니다.

{ 
    'progs': ['blastall', 'formatdb', 'megablast'], 
    'hits': 1212, 
    '_id': {'version': '2.2.21', 'pack': 'blast'}, 
    'users': ['7225', '1234', '9876] 
} 

제가 abble 싶습니다 것은의 progs에 저장하는 프로그램 사용의 정보를 나열 ;-) 예상대로

pack_ag = col.aggregate([ 
    {'$match': {"date": {'$gte':start, '$lt': end}}}, 
    {'$project' : {'pack':1, 'version':1, 'prg':1, 'uid':1}}, 
    {'$group' :{"_id":{"pack":"$pack", "version":"$version"}, 'hits': {'$sum': 1}, 'progs': { '$addToSet': "$prg"}, 'users': {'$addToSet': '$uid'}}}]) 

는 나에게 뭔가를 제공합니다. 예를 들어 같은 얻을 : 내가 찾아 결과를 반복 것보다 다른 방법으로 작업을 수행하는 방법을 알고 팩/버전/PRG 일치하는 문서를 포함되지 않습니다 나는 curently 것을 인정해야

progs': [{'blastall': 1000}, {'formatdb': 200}, {'megablast':12}] 

을 그 다음에 문서를 갱신한다.

여기에 momgo 쿼리 수준에서 전체 채우기 방법이 있습니까?

답변

0

당신은 확실히 정확히으로 예상되는 형식으로 결과를 집계 할 수 있습니다

progs': [{'blastall': 1000}, {'formatdb': 200}, {'megablast':12}] 

하지만 확실히 유용하고 쉽게 검색 할 것입니다 것을 매우 근접합니다.

  • pack, versionprgpackversion, group, 기록의 조합에 대한 고유 programs의 수를 얻으려면. 각 그룹의 $sum 연산자는 각각의 고유 한 카운트를 제공합니다 prg. 각 prg에 대한 레코드 목록에 대한 참조를 보유하십시오.
  • 이제 rec 필드를 기준으로 그룹화 된 레코드의 풀기를 수행하십시오.
  • prg 및 의 이름을 가진 개체로 프로젝트 prg_detail을 각 레코드에 대해 계산합니다.
  • 해제 된 레코드를 다시 packversion 개의 특성으로 그룹화하고 사용자 및 prog 항목을 고유 목록으로 누적하십시오.

수정 코드 :

col.aggregate([ 
{$match: {"date": {$gte:start, $lt: end}}}, 
{$group:{"_id":{"pack":"$pack","version":"$version","prg":"$prg"}, 
     "count":{$sum:1},"rec":{$push:"$$ROOT"}}}, 
{$unwind:"$rec"}, 
{$project:{"pack":"$_id.pack","version":"$_id.version", 
      "prg_detail":{"name":"$_id.prg","count":"$count"},"rec":1}}, 
{$group:{"_id":{"pack":"$pack", 
       "version":"$version"}, 
     "progs":{$addToSet:"$prg_detail"}, 
     "hits":{$sum:1}, 
     "users":{$addToSet:"$rec.uid"}}}]) 

샘플의 O/P는 :

{ 
     "_id" : { 
       "pack" : "blast", 
       "version" : "2.2.21" 
     }, 
     "progs" : [ 
       { 
         "name" : "blastall", 
         "count" : 1 
       }, 
       { 
         "name" : "formatDB", 
         "count" : 2 
       }, 
       { 
         "name" : "megaBlast", 
         "count" : 1 
       } 
     ], 
     "hits" : 4, 
     "users" : [ 
       "7225", 
       "7229", 
       "7226", 
       "7227" 
     ] 
}