2012-06-10 37 views
5

Tôi nhận được MongoDB khá lớn mà tôi cần trích xuất số liệu thống kê và tôi thực hiện việc mua này để chạy truy vấn Map Reduce.Bản đồ MongoDB giảm với truy vấn

Vấn đề bây giờ mà tôi cần phải thu hẹp các truy vấn để sử dụng cho tình trạng ví dụ là:. 'Soạn thảo" thay vì sử dụng toàn bộ bộ sưu tập

Đây là Bản đồ của tôi/Giảm mã (Tôi đang sử dụng CodeIgniter): tôi cố gắng để làm theo các bước cuối cùng trong truy vấn này nhưng tôi không thể có được kết quả vì vậy tôi nghĩ tôi thêm các sai cú pháp:. http://cookbook.mongodb.org/patterns/unique_items_map_reduce/

$map = new MongoCode ("function() { 

       day = Date.UTC(this.created_at.getFullYear(), this.created_at.getMonth(), this.created_at.getDate()); 

       emit ({day: day, _id: this._id}, {created_at: this.created_at, count: 1}); 

      }"); 

      $reduce = new MongoCode ("function(key , values) { 

       var count = 0; 

       values.forEach (function(v) { 

        count += v['count']; 

       }); 

       return {count: count}; 

      }"); 

      $outer = $this->cimongo->command (array (

       "mapreduce" => "documents", 

       "map"  => $map, 

       "reduce" => $reduce, 

       "out"  => "stats_results" 

      )); 


      $map = new MongoCode ("function() { 

       emit(this['_id']['day'], {count: 1}); 

      }"); 

      $reduce = new MongoCode ("function(key , values) { 

       var count = 0; 

       values.forEach (function(v) { 

        count += v['count']; 

       }); 

       return {count: count}; 

      }"); 

      $outer = $this->cimongo->command (array (

       "mapreduce" => "stats_results", 

       "map"  => $map, 

       "reduce" => $reduce, 

       "out"  => "stats_results_unique" 

      )); 
+0

Ý anh là gì với "tình trạng sử dụng 'soạn thảo'"? Bạn có muốn tránh ánh xạ toàn bộ bảng hay chỉ đủ các phím phát ra với trạng thái đó? Tôi đoán rằng những gì bạn muốn là điều kiện phát ra kết quả dựa trên trường trạng thái. – evnu

Trả lời

1

Bạn có thể sử dụng rock mongo hoặc mongo3 để có được số liệu thống kê chi tiết và kết quả về bản đồ/giảm hoặc chỉ số

I preffer rock_mongo, có nhiều tính năng hơn.

12

Hai điều về câu hỏi của bạn:

1) Ví dụ trong sách dạy nấu ăn có thể là một chút quá phức tạp cho những gì bạn đang cố gắng làm. Đây là một đơn giản nhất:

Cho một cấu trúc tài liệu trông như thế này:

{ 
    "url" : "http://example.com/page8580.html", 
    "user_id" : "Jonathan.Clark", 
    "date" : ISODate("2012-06-11T10:59:36.271Z") 
} 

Dưới đây là một số mẫu mã JavaScript để chạy một bản đồ/giảm công việc mà sẽ đếm số lần truy cập mỗi URL riêng biệt.

// Map function: 

map = function() { 
    emit({ url: this.url }, {count: 1}); 
} 

// Reduce function: 

reduce = function(key, values) { 
    var count = 0; 

    values.forEach(
    function(val) { count += val['count']; } 
    ); 

    return {count: count}; 
}; 

// Run the Map/Reduce function across the 'pageviews' collection: 
// Note that MongoDB will store the results in the 'pages_per_day' 
// collection because the 'out' parameter is present 

db.pageviews.mapReduce( 
    map,  // pass in the 'map' function as an argument 
    reduce,  // pass in the 'reduce' function as an argument 
    // options 
    { out: 'pages_per_day',  // output collection 
     verbose: true }  // report extra statistics 
); 

2) Nếu bạn muốn chạy bản đồ/Giảm chức năng trên chỉ là một tập hợp con của các bộ sưu tập 'lần truy cập trang', bạn có thể chỉ định một truy vấn đến các cuộc gọi đến 'MapReduce()' để hạn chế số lượng các văn bản rằng 'bản đồ()' chức năng sẽ hoạt động trên:

// Run the Map/Reduce function across the 'pageviews' collection, but 
// only report on the pages seen by "Jonathan.Clark" 

db.pageviews.mapReduce( 
    map,  // Use the same map & reduce functions as before 
    reduce,  
    { out: 'pages_per_day_1user',  // output to different collection 
     query:{ 'user_id': "Jonathan.Clark" }  // query descriptor 
     verbose: true }  
); 

Lưu ý rằng nếu bạn không sử dụng JavaScript, bạn sẽ phải dịch các cuộc gọi vào bất cứ ngôn ngữ lập trình bạn đang sử dụng.

3) Dưới đây là một ví dụ về cách gọi Map/chức năng Giảm với một điều kiện truy vấn sử dụng PHP:

$outer = $this->cimongo->command (array (
       "mapreduce" => "pageviews", 
       "map"  => $map, 
       "reduce" => $reduce, 
       "out"  => "pages_per_day_1user", 
       "query"  => array("user_id" => "Jonathan.Clark") 
      )); 

4) Để biết thêm thông tin về Bản đồ/Giảm, xem tài liệu tham khảo sau đây:

+0

param truy vấn là những gì tôi đang tìm kiếm, tuy nhiên là nó có thể truy vấn một mảng các giá trị? ví dụ trong find() tôi sử dụng một cái gì đó như _id: {$ in: [1,2,3,4]} – abritez

+0

Tham số 'truy vấn' chứa một tài liệu mô tả một truy vấn MongoDB tùy ý; bạn có thể sử dụng bất kỳ cú pháp hợp lệ nào bạn thích trong trường đó. –

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