2010-06-09 41 views
12

Bản đồ lần đầu tiên/Giảm người dùng tại đây và sử dụng MongoDB. Tôi có rất nhiều dữ liệu truy cập trang mà tôi muốn tạo ra một số ý nghĩa bằng cách sử dụng Map/Reduce. Dưới đây là cơ bản những gì tôi muốn làm, nhưng như một người mới bắt đầu tổng cộng một bản đồ/giảm, tôi nghĩ rằng đây là trên kiến ​​thức của tôi!Bản đồ Mongo Giảm lần đầu tiên

  1. Đi qua tất cả các trang có lượt truy cập trong 30 ngày qua và nơi bên ngoài = true.
  2. Sau đó cho mỗi trang, tất cả lần
  3. Nhóm tất cả các chuyến thăm của vị trí giới thiệu
  4. Đối với mỗi vị trí giới thiệu, tính toán bao nhiêu sau đó đi đến thăm một trang trong đó có một "loại" nhất định và cũng có một từ nào đó trong "thẻ".

Cơ sở dữ liệu và bộ sưu tập được tổ chức như tài liệu

$mongo->dbname->visits 

Một mẫu là:

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

Và sau đó tôi muốn tìm các tài liệu của loại B với một thẻ nhất định.

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

Tôi đang sử dụng phần mở rộng Mongo PHP bình thường nếu có tác động.

+1

Bạn có cấu trúc cơ sở dữ liệu nào? Bộ sưu tập và tài liệu của bạn được tổ chức như thế nào? –

+0

Đã thêm vào bài đăng ở trên. Trợ giúp đó? – James

+0

OK, tài liệu mẫu của bạn không bao gồm trường "giới thiệu" là trường "bên ngoài" hoặc "thẻ". Điều bạn đang đề xuất thực sự phức tạp, vì vậy có thể bạn sẽ cần hiển thị cho chúng tôi nhiều tài liệu. Và có thể bạn sẽ cần phải hiển thị nó với tất cả các chi tiết. –

Trả lời

16

Ok, tôi đã nghĩ ra điều gì đó mà tôi nghĩ rằng có thể làm những gì bạn muốn. Lưu ý rằng điều này có thể không hoạt động chính xác vì tôi không chắc chắn 100% lược đồ của bạn (xem xét ví dụ của bạn hiển thị refer có sẵn trong loại a, nhưng không b (Tôi không chắc đó có phải là thiếu sót hay không) xem bằng cách referer) ... Dù sao, đây là những gì tôi đã đi lên với:

chức năng bản đồ:

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); 
} 

Giảm mức chức năng:

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; 
} 

Vì vậy, về cơ bản, cách thức hoạt động Chức năng Bản đồ này sử dụng khóa refer.url (những gì tôi đoán dựa trên desc của bạn) ription). Vì vậy, kết quả cuối cùng sẽ trông giống như một mảng với _id bằng refer.url (Nhóm này dựa trên url). Sau đó nó tạo ra một đối tượng có hai đối tượng bên dưới nó (các loại và các thẻ). Lý do cho đối tượng là để bản đồ và giảm có thể phát ra cùng một đối tượng định dạng. Khác hơn thế, tôi nghĩ rằng nó nên tương đối tự giải thích (Nếu bạn không hiểu, tôi có thể cố gắng giải thích thêm) ...

Vì vậy, hãy thực hiện điều này trong PHP (Giả sử rằng $map$reduce là chuỗi ở trên có chứa chúng cho terseness):

$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"; 
} 

Lưu ý, tôi chưa thử nghiệm này. Đây chỉ là những gì tôi đã đưa ra dựa trên sự hiểu biết của tôi về giản đồ của bạn, và từ sự hiểu biết của tôi về Mông Cổ và Bản đồ-Giảm mình thực hiện ...

+0

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

Các vấn đề liên quan