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

Làm thế nào để tính toán sự khác biệt giữa các giá trị của các tài liệu khác nhau bằng cách sử dụng tổng hợp mongo?

Câu hỏi khó về nguyên tắc, nhưng tôi sẽ ở lại với trường hợp đơn giản mà bạn trình bày về hai tài liệu và đưa ra giải pháp cho vấn đề đó. Các khái niệm nên trừu tượng, nhưng khó hơn đối với các trường hợp mở rộng. Có thể có với khung tổng hợp nói chung:

db.collection.aggregate([
    // Match the documents in a pair
    { "$match": {
        "timeMilliSec": { "$in": [ 1414590255, 1414590245 ] }
    }}

    // Trivial, just keeping an order
    { "$sort": { "timeMilliSec": -1 } },

    // Unwind the arrays
    { "$unwind": "$data" },

    // Group first and last
    { "$group": {
        "_id": "$data.name",
        "firstX": { "$first": "$data.x" },
        "lastX": { "$last": "$data.x" },
        "firstY": { "$first": "$data.y" },
        "lastY": { "$last": "$data.y" }
    }},

    // Difference on the keys
    { "$project": {
        "diff": {
            "$divide": [
                { "$subtract": [ "$firstX", "$lastX" ] },
                { "$subtract": [ "$firstY", "$lastY" ] }
            ]
        }
    }},

    // Not sure you want to take it this far
    { "$group": {
        "_id": null,
        "diffX": { 
            "$min": {
                "$cond": [
                     { "$eq": [ "$_id", "X" ] },
                     "$diff",
                     false
                 ]
            }
        },
        "diffY": { 
            "$min": {
                "$cond": [
                     { "$eq": [ "$_id", "Y" ] },
                     "$diff",
                     false
                 ]
            }
        }
    }}
])

Có thể bị thổi phồng quá mức, không chắc chắn về mục đích, nhưng kết quả của điều này dựa trên mẫu sẽ là:

{ 
    "_id" : null, 
    "diffX" : 0.14285714285714285, 
    "diffY" : 0.6 
}

Phù hợp với các tính toán.

Bạn có thể điều chỉnh cho phù hợp với trường hợp của mình, nhưng nguyên tắc chung là như được minh họa.

Giai đoạn "đường ống" cuối cùng có một chút "cực đoan" vì tất cả những gì được thực hiện là kết hợp các kết quả vào một tài liệu duy nhất. Nếu không, kết quả "X" và "Y" đã nhận được trong hai tài liệu trong đường ống. Chủ yếu là của $group hoạt động với $first $last hoạt động để tìm các phần tử tương ứng trên ranh giới nhóm.

Các hoạt động tiếp theo trong $project như một giai đoạn đường ống thực hiện phép toán cần thiết để xác định các kết quả khác biệt. Xem toán tử tổng hợp để biết thêm chi tiết, đặc biệt là $divide $subtract .

Dù bạn làm gì bạn cũng theo khóa học này. Nhận một cặp "bắt đầu" và "kết thúc" trên hai phím của bạn. Sau đó, thực hiện các phép tính.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Lưu trường có dấu chấm trong MongoDB

  2. Kết nối với MongoDB qua SSL với Node.js

  3. Ngoại lệ tuần tự hóa Scala với Giá trị liệt kê

  4. Tối đa và tối thiểu trong mongodb

  5. tài liệu nhúng so với kiểu dữ liệu băm trong mongoid