2013-10-29 1 views
3

$ project를 할 때 간단한 String 조작을 적용하고 싶습니다. $ project에 다음 함수를 적용 할 수 있습니까?

db.clientRequest.aggregate(
{ 
$match: { 
    "l": {$regex: ".*zip"}, 
    "t": { "$gte": new Date('1/SEP/2013'), 
        "$lte": new Date('7/OCT/2013') 
        } 
    } 
}, 
{ 
    $project: {"theme_url" : "$l", "_id": 0, "time": "$t"} 
}, 
{ 
    $group: { _id: { 
         theme_url: "$theme_url", 
         day: { 
           "day": {$dayOfMonth : "$time"}, 
           "month": {$month: "$time"}, 
           "year": {$year: "$time"} 
          }, 
       }, 
       count: {$sum:1} 
    } 
} 

)

이 다음 반환 :

 { 
     "_id" : { 
      "theme_url" : "content/theme/T70/zip", 
      "day" : { 
       "day" : 13, 
       "month" : 9, 
       "year" : 2013 
      } 
     }, 
     "count" : 2 
    } 

은 내가 theme_url 필드 위의 함수를 적용 할 수 있습니다 : 나는 다음과 같은 쿼리를 사용하고

var themeIdFromZipUrl = function(zipUrl){ 
    return zipUrl.match(/.*\/(T\d+)\/.*/)[1] 
}; 

theme_id으로 바꾸시겠습니까? Map-Reduce에 대해 조금 훑어 보았습니다. 그러나 그런 쉬운 경우에는 너무 복잡할지 모르겠습니다.

감사합니다.

Amit.

+1

현재이 작업을 직접 수행 할 수있는 지원은 없지만 집계 프레임 워크 (문자열 비교를 위해 문자 비교 작업 포함)를 사용하는 것은 추악한 방법입니다. –

답변

1

현재 집계 프레임 워크를 사용하여이를 수행 할 방법이 없습니다.

MapReduce로 할 수 있지만 데이터 양이 많은 경우 전체 작업 속도가 느려질 수 있습니다.

집계의 마지막 단계 인 경우 집계가 완료된 후 클라이언트 측에서 수행 할 수도 있습니다. 예 : 몽고 쉘에서 :

var aggregationResults = col.aggregate([ /* aggregation pipeline here */]); 
aggregationResults.results.forEach(function(x) { 
    x._id.theme_id = themeIdFromUrl(x._id.themeUrl); 
}); 

다른 언어 용 드라이버를 사용하는 경우 당신은 물론, 사용하는 어떤 언어로이 작업을 수행해야합니다.

일반적으로 말하자면 데이터에 theme_url이 포함되어 있고 theme_id가 URL에 인코딩되어 있으면 자체 필드에 저장하는 것이 좋습니다. Mongo는 텍스트 조작을위한 훌륭한 도구는 아닙니다.