MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Bản đồ Mongo Giảm lần đầu tiên

Được rồi, tôi đã nghĩ ra điều gì đó mà tôi nghĩ 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% về lược đồ của bạn (xem xét các ví dụ của bạn cho thấy refer có sẵn trong loại a, nhưng không phải b (tôi không chắc đó có phải là một thiếu sót hay không, hay điều mà bạn muốn xem bởi người giới thiệu) ... Dù sao, đây là những gì tôi đã nghĩ ra:

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

Chức năng Rút gọn:

Hàm
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, nó hoạt động như thế nào đây. Chức năng Bản đồ sử dụng một khóa là reference.url (những gì tôi đoán dựa trên mô tả của bạn). Vì vậy, kết quả cuối cùng sẽ giống như một mảng với _id ngang bằng với reference.url (Nó nhóm dựa trên url). Sau đó, nó tạo ra một đối tượng có hai đối tượng dưới nó (loại và thẻ). Lý do cho đối tượng là bản đồ và thu nhỏ có thể phát ra cùng một đối tượng định dạng. Ngoài ra, tôi nghĩ rằng nó phải 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 triển khai điều này trong PHP (Giả sử rằng $map$reduce là các chuỗi với những thứ ở trên được chứa với chúng cho ngắn gọn):

$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 điều này. Đây chỉ là những gì tôi nghĩ ra dựa trên sự hiểu biết của tôi về lược đồ của bạn và từ sự hiểu biết của tôi về Mongo và triển khai Map-Reduce của nó ...



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Mongo $ addToSet với nhiều giá trị đúng cú pháp

  2. Spring-boot:so sánh ngày mongoDB không hoạt động

  3. bản đồ / thu nhỏ có thích hợp để tìm giá trị trung bình và chế độ của một bộ giá trị cho nhiều bản ghi không?

  4. Sao chép giá trị mảng đầu tiên sang một trường khác trong MongoDB

  5. Làm thế nào để tìm các cặp gần nhất (Khoảng cách Hamming) của một chuỗi các thùng nhị phân trong Ruby mà không gặp vấn đề về O ^ 2?