2010-06-09 6 views
12

처음으로지도/사용자를 줄이고 MongoDB를 사용합니다. 나는 Map/Reduce를 사용하여 어떤 느낌을주기 위해 많은 페이지 방문 데이터를 가지고있다. 아래는 기본적으로 내가하고 싶은 일이지만 Map/Reduce의 총 초심자로서 이것이 내 지식 이상이라고 생각합니다!Mongo Map 처음으로 줄이기

  1. 지난 30 일 동안 방문이 있었고 외부 = true 인 모든 페이지를 살펴보십시오.
  2. 그런 다음 각 페이지에, 많은 사람들이 다음 일정 "유형"이있는 페이지를 방문했다 방법을 각각 추천 위치는 추천 위치
  3. 모든 방문, 계산 모든 방문
  4. 그룹을 발견하고 또한 특정 단어를 가지고 "태그"에

    {"url": "www.example.com", "type": "a", "refer": {"external": true, "domain": "twitter.com", "url": "http://www.twitter.com/page"}, "page": "1235", "user": "1232", "time": 1234567890} 
    

    그리고 나는 특정 태그 B 형의 문서를 찾으려면 :

데이터베이스 및 수집이

$mongo->dbname->visits 

샘플 문서로 구성되어 같습니다.

{"url": "www.example.com", "type": "b", "page": "745", "user": "1232", "time": 1234567890, "tags": {"a", "b", "c"}} 

영향이있는 경우 일반 Mongo PHP 확장 프로그램을 사용하고 있습니다.

+1

어떤 데이터베이스 구조가 있습니까? 귀하의 소장품 및 서류는 어떻게 구성되어 있습니까? –

+0

위 게시물에 추가되었습니다. 그게 도움이 되니? – James

+0

OK, 샘플 문서에 "referral"또는 "external"또는 "tags"필드가 포함되어 있지 않습니다. 당신이 제안하는 것은 실제로 복잡하기 때문에 아마도 하나 이상의 문서를 보여 주어야 할 것입니다. 그리고 아마 모든 세부 사항을 보여줄 필요가있을 것입니다. –

답변

16

좋아, 나는 내가 라고 생각하면이 원하는 것을 할 수 있다고 생각합니다. 내가이 스키마가 100 % 확신 할 수는 없으므로 정확하게 작동하지 않을 수 있습니다 (예 : refer이 유형 a로 사용 가능하지만 b가 아닌 것으로 나타났습니다. (누락인지 또는 원하는지 고려하지 않아도됩니다.)

지도 기능 :

function() { 
    var obj = { 
     "types": {}, 
     "tags": {}, 
    } 
    obj.types[this.type] = 1; 
    if (this.tags) { 
     for (var tag in this.tags) { 
      obj.tags[this.tags[tag]] = 1; 
     } 
    } 
    emit(this.refer.url, obj); 
} 

줄이기 기능 : 그러니까 기본적으로

function(key, values) { 
    var obj = { 
     "types": {}, 
     "tags": {}, 
    } 
    for (var i = 0; i < values.length; i++) { 
     for (var type in values[i].types) { 
      if (!type in obj.types) { 
       obj.types[type] = 0; 
      } 
      obj.types[type] += values[i].types[type]; 
     } 
     for (var tag in values[i].tags) { 
      if (!tag in obj.tags) { 
       obj.tags[tag] = 0; 
      } 
      obj.tags[tag] += values[i].tags[tag]; 
     } 
    } 
    return obj; 
} 

이 어떻게 작동하는지 내가 가지고 올 한 내용을 리퍼러로보기) ... 어쨌든, 여기에 Map 함수는 refer.url의 키를 사용한다. ription). 따라서 최종 결과는 _id 인 refer.url (URL 기반 그룹)과 같은 배열처럼 보입니다. 그런 다음 두 개의 객체 (유형 및 태그)가있는 객체를 만듭니다. 오브젝트가있는 이유는 map 및 reduce가 동일한 형식 오브젝트를 내보낼 수 있기 때문입니다. 그 외에는, 나는 그래서 ($map$reduce가와 문자열 있다고 가정의는 PHP에서이를 구현하자 ...

을 (당신이 이해하지 않는 경우, 좀 더 설명하려고 수)는 상대적으로 자기 설명해야한다고 생각 간결함을 위해 위에 포함되어 있음) :

$mapFunc = new MongoCode($map); 
$reduceFunc = new MongoCode($reduce); 
$query = array(
    'time' => array('$gte' => time() - (60*60*60*24*30)), 
    'refer.external' => true 
); 
$collection = 'visits'; 
$command = array(
    'mapreduce' => $collection, 
    'map' => $mapFunc, 
    'reduce' => $reduceFunc, 
    'query' => $query, 
); 

$statsInfo = $db->command($command); 

$statsCollection = $db->selectCollection($sales['result']); 

$stats = $statsCollection->find(); 

foreach ($stats as $stat) { 
    echo $stats['_id'] .' Visited '; 
    foreach ($stats['value']['types'] as $type => $times) { 
     echo "Type $type $times Times, "; 
    } 
    foreach ($stats['value']['tags'] as $tag => $times) { 
     echo "Tag $tag $times Times, "; 
    } 
    echo "\n"; 
} 

참고로이 테스트를 수행하지 않았습니다. 이

+0

$ statsCollection = $ db-> selectCollection ($ sales [ 'result']); $ sales? – Tobias