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

cách tính số đếm và số lượng duy nhất trên hai trường trong hàm giảm mongo

Bạn thực sự có thể truyền đối tượng tùy ý vào tham số thứ hai của lệnh gọi. Điều đó có nghĩa là bạn có thể tận dụng điều này và lưu trữ userid trong đó. Ví dụ:chức năng bản đồ của bạn có thể trông như thế này:

var mapFunc = function() {
  if (this.track_redirect) {
    var tempDoc = {};
    tempDoc[this.track_userid] = 1;

    emit(this.track_redirect, {
      users_clicked: tempDoc,
      total_clicks: 1
    });
  }
};

Và hàm giảm của bạn có thể trông giống như sau:

var reduceFunc = function(key, values) {
  var summary = {
    users_clicked: {},
    total_clicks: 0
  };

  values.forEach(function (doc) {
    summary.total_clicks += doc.total_clicks;
    // Merge the properties of 2 objects together
    // (and these are actually the userids)
    Object.extend(summary.users_clicked, doc.users_clicked);
  });

  return summary;
};

Thuộc tính users_clicked của đối tượng tóm tắt về cơ bản lưu trữ id của mọi người dùng dưới dạng một thuộc tính (vì bạn không thể có các thuộc tính trùng lặp, bạn có thể đảm bảo rằng nó sẽ lưu trữ những người dùng duy nhất). Cũng lưu ý rằng bạn phải cẩn thận với thực tế là một số giá trị được chuyển đến hàm giảm có thể là kết quả của lần giảm trước đó và mã mẫu ở trên có tính đến điều đó. Bạn có thể tìm thêm về hành vi đã nói trong tài liệu tại đây .

Để có được số lượng duy nhất, bạn có thể chuyển vào hàm cuối cùng được gọi khi giai đoạn giảm hoàn thành:

var finalFunc = function(key, value) {
  // Counts the keys of an object. Taken from:
  // http://stackoverflow.com/questions/18912/how-to-find-keys-of-a-hash
  var countKeys = function(obj) {
    var count = 0;

    for(var i in obj) {
      if (obj.hasOwnProperty(i))
      {
        count++;
      }
    }

    return count;
  };

  return {
    redirect: key,
    total_clicks: value.total_clicks,
    unique_clicks: countKeys(value.users_clicked)
  };
};

Cuối cùng, bạn có thể thực hiện công việc thu nhỏ bản đồ như thế này (sửa đổi thuộc tính out để phù hợp với nhu cầu của bạn):

db.users.mapReduce(mapFunc, reduceFunc, { finalize: finalFunc, out: { inline: 1 }});



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Xác thực MongoDB trên mLab không thành công

  2. Thay đổi kích thước hình ảnh với Nodejs và Imagemagick

  3. Sử dụng MongoDB và Neo4j cùng nhau

  4. Tìm kiếm nhiều mảng lồng nhau trong Mongodb

  5. Phân trang phía máy chủ với trường mảng chuỗi tài liệu đơn lẻ