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

Tổng hợp MongoDB:Tính Tổng số đang chạy từ tổng của các hàng trước đó

Điều này làm những gì bạn cần. Tôi đã chuẩn hóa thời gian trong dữ liệu để chúng nhóm lại với nhau (Bạn có thể làm điều gì đó như thế này). Ý tưởng là $group và đẩy time của và total thành các mảng riêng biệt. Sau đó, $unwind time mảng và bạn đã tạo một bản sao của total mảng cho mỗi time tài liệu. Sau đó, bạn có thể tính toán runningTotal (hoặc một cái gì đó như giá trị trung bình luân phiên) từ mảng chứa tất cả dữ liệu cho các thời điểm khác nhau. 'Chỉ mục' được tạo bởi $unwind là chỉ số mảng cho total tương ứng với time đó . Điều quan trọng là phải $sort trước $unwind ing vì điều này đảm bảo các mảng theo đúng thứ tự.

db.temp.aggregate(
    [
        {
            '$group': {
                '_id': '$time',
                'total': { '$sum': '$value' }
            }
        },
        {
            '$sort': {
                 '_id': 1
            }
        },
        {
            '$group': {
                '_id': 0,
                'time': { '$push': '$_id' },
                'totals': { '$push': '$total' }
            }
        },
        {
            '$unwind': {
                'path' : '$time',
                'includeArrayIndex' : 'index'
            }
        },
        {
            '$project': {
                '_id': 0,
                'time': { '$dateToString': { 'format': '%Y-%m-%d', 'date': '$time' }  },
                'total': { '$arrayElemAt': [ '$totals', '$index' ] },
                'runningTotal': { '$sum': { '$slice': [ '$totals', { '$add': [ '$index', 1 ] } ] } },
            }
        },
    ]
);

Tôi đã sử dụng một cái gì đó tương tự trên một bộ sưu tập với ~ 80 000 tài liệu, tổng hợp thành 63 kết quả. Tôi không chắc nó sẽ hoạt động tốt như thế nào trên các bộ sưu tập lớn hơn, nhưng tôi nhận thấy rằng việc thực hiện các phép biến đổi (phép chiếu, thao tác mảng) trên dữ liệu tổng hợp dường như không có chi phí hiệu suất lớn khi dữ liệu được giảm xuống kích thước có thể quản lý được.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Triển khai cơ sở dữ liệu đám mây với ClusterControl 1.6

  2. Dịch <T> có thể truy vấn trở lại IMongoQuery

  3. Tổng hợp $ tra cứu với C #

  4. MongoDB $ min

  5. Ngăn chặn JavaScript NoSQL Injection trong MongoDB