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

Phần trăm các điều kiện OR được so khớp trong mongodb

Giải pháp của bạn thực sự phải là MongoDB cụ thể nếu không bạn sẽ thực hiện các tính toán của mình và khả năng đối sánh ở phía máy khách và điều đó sẽ không tốt cho hiệu suất.

Vì vậy, tất nhiên những gì bạn thực sự muốn là một cách để xử lý ở phía máy chủ:

db.products.aggregate([

    // Match the documents that meet your conditions
    { "$match": {
        "$or": [
            { 
                "features": { 
                    "$elemMatch": {
                       "key": "Screen Format",
                       "value": "16:9"
                    }
                }
            },
            { 
                "features": { 
                    "$elemMatch": {
                       "key" : "Weight in kg",
                       "value" : { "$gt": "5", "$lt": "8" }
                    }
                }
            },
        ]
    }},

    // Keep the document and a copy of the features array
    { "$project": {
        "_id": {
            "_id": "$_id",
            "product_id": "$product_id",
            "ean": "$ean",
            "brand": "$brand",
            "model": "$model",
            "features": "$features"
        },
        "features": 1
    }},

    // Unwind the array
    { "$unwind": "$features" },

    // Find the actual elements that match the conditions
    { "$match": {
        "$or": [
            { 
               "features.key": "Screen Format",
               "features.value": "16:9"
            },
            { 
               "features.key" : "Weight in kg",
               "features.value" : { "$gt": "5", "$lt": "8" }
            },
        ]
    }},

    // Count those matched elements
    { "$group": {
        "_id": "$_id",
        "count": { "$sum": 1 }
    }},

    // Restore the document and divide the mated elements by the
    // number of elements in the "or" condition
    { "$project": {
        "_id": "$_id._id",
        "product_id": "$_id.product_id",
        "ean": "$_id.ean",
        "brand": "$_id.brand",
        "model": "$_id.model",
        "features": "$_id.features",
        "matched": { "$divide": [ "$count", 2 ] }
    }},

    // Sort by the matched percentage
    { "$sort": { "matched": -1 } }

])

Như bạn đã biết "chiều dài" của $or điều kiện đang được áp dụng, thì bạn chỉ cần tìm xem có bao nhiêu phần tử trong mảng "tính năng" phù hợp với các điều kiện đó. Vì vậy, đó là tất cả những gì so khớp $ thứ hai trong quy trình.

Khi bạn có số đó, bạn chỉ cần chia cho số điều kiện đã được chuyển vào dưới dạng $or của bạn . Cái hay ở đây là bây giờ bạn có thể làm điều gì đó hữu ích với điều này như sắp xếp theo mức độ liên quan và sau đó thậm chí "trang" phía máy chủ kết quả.

Tất nhiên nếu bạn muốn một số "phân loại" bổ sung này, tất cả những gì bạn cần làm là thêm một $project khác giai đoạn cuối của quy trình:

    { "$project": {
        "product_id": 1
        "ean": 1
        "brand": 1
        "model": 1,
        "features": 1,
        "matched": 1,
        "category": { "$cond": [
            { "$eq": [ "$matched", 1 ] },
            "100",
            { "$cond": [ 
                { "$gte": [ "$matched", .7 ] },
                "70-99",
                { "$cond": [
                   "$gte": [ "$matched", .4 ] },
                   "40-69",
                   "under 40"
                ]} 
            ]}
        ]}
    }}

Hoặc như một cái gì đó tương tự. Nhưng $cond nhà điều hành có thể giúp bạn ở đây.

Kiến trúc phải ổn như bạn có vì bạn có thể có một chỉ mục kết hợp trên "khóa" và "giá trị" cho các mục nhập trong mảng tính năng của bạn và điều này sẽ mở rộng quy mô tốt cho các truy vấn.

Tất nhiên nếu bạn thực sự cần thứ gì đó hơn thế, chẳng hạn như tìm kiếm theo từng khía cạnh và kết quả, bạn có thể xem xét các giải pháp như Solr hoặc tìm kiếm đàn hồi. Nhưng việc triển khai đầy đủ điều đó sẽ hơi dài cho ở đây.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Sử dụng .sort với PyMongo

  2. Liên kết &Tạo MongoDB tham gia bằng SQL:Phần 2

  3. Meteor có những cơ chế bảo mật nào?

  4. Mongodb:không kết nối được với máy chủ trong lần kết nối đầu tiên

  5. Nhận được kết quả $ nhóm với số lượng nhóm