2015-05-27 15 views
5

tôi đang làm việc trên một dự án đòi hỏi tôi phải tạo một truy vấn MongoDB động một cách nhanh chóng dựa trên rất nhiều các trận đấu (có thể là một tiềm năng của 100). Trên đầu trang của việc tạo ra các chỉ số thích hợp tôi đã tự hỏi nếu nó quan trọng như thế nào tôi xây dựng các trận đấu vào đường ống. Dựa trên ví dụ sau, liệu một trong các ví dụ này có thực hiện khác hoặc tốt hơn ví dụ khác không?MongoDB (3.0) Kết hợp: Một số trận đấu vs Một trận đấu với nhiều mục

tôi giả Ví dụ 2 sẽ widdle xuống kết quả thiết lập nhưng có nhiều cuộc gọi? Có lẽ đó là những gì Ví dụ 1 đang làm đằng sau hậu trường?

Cảm ơn trước sự giúp đỡ của bạn!

Ví dụ 1

db.Test.aggregate(
[  
    { $match: { item1: 'foo1', item2: 'foo2', item3: 'foo3' } } 
]) 

vs

Ví dụ 2

db.Test.aggregate(
[  
    { $match: { item1: 'foo1' } }, 
    { $match: { item2: 'foo2' } }, 
    { $match: { item3: 'foo3' } } 
]) 

Tôi nghi ngờ điều đó quan trọng cho câu hỏi này, nhưng nếu có liên quan tôi sẽ sử dụng C# driver cho triển khai của tôi.

+0

Câu hỏi thú vị ... bạn đã quản lý để tìm và trả lời chưa? – Moppo

+0

Tôi cũng tò mò muốn biết! –

Trả lời

1

tôi tìm thấy các thông tin sau trong MongoDB's documentation:

$match + $match kết dính

Khi một $match ngay lập tức sau một $match, hai giai đoạn có thể hợp lại thành một $ trận đấu đơn lẻ kết hợp các điều kiện với một $and. Ví dụ, một đường ống có chứa các trình tự sau:

{ $match: { year: 2014 } }, 
{ $match: { status: "A" } } 

Sau đó, giai đoạn $ trận đấu thứ hai có thể hợp lại thành các giai đoạn $ trận đấu đầu tiên và kết quả là một giai đoạn $ trận đấu duy nhất:

{ $match: { $and: [ { "year" : 2014 }, { "status" : "A" } ] } } 

Từ điều này tôi có thể nói rằng sử dụng một số $match trong một nguyên là hoàn toàn tương đương với việc sử dụng một đơn $match với nhiều trường.

Tôi tuy nhiên không chắc chắn tại sao động cơ tối ưu hóa thêm một nhà điều hành $and đây. Theo this answer nó không cần thiết, do đó tôi nghĩ rằng nó có thể được bỏ qua. Ai đó có thể xác nhận?

0

tôi đã tự hỏi điều tương tự hôm nay và vấp vào câu trả lời của Romain.Mặc dù tôi muốn thấy điều này cho bản thân mình, mà có thể dễ dàng được thực hiện bằng cách sử dụng một giải thích trên cả hai tập hợp;

db.verpakking.explain().aggregate([ 
    { "$match": {type: "VERPAKT"} }, 
    { "$match": {ras: "CherryStar"} }, 
]); 

Những kết quả trong các kết quả sau:

{ 
    "waitedMS" : NumberLong(0), 
    "stages" : [ 
    { 
     "$cursor" : { 
     "query" : { 
      "$and" : [ 
      { 
       "type" : "VERPAKT" 
      }, 
      { 
       "ras" : "CherryStar" 
      } 
      ] 
     }, 
     "queryPlanner" : { 
      "plannerVersion" : NumberInt(1), 
      "namespace" : "denberk.verpakking", 
      "indexFilterSet" : false, 
      "parsedQuery" : { 
      "$and" : [ 
       { 
       "ras" : { 
        "$eq" : "CherryStar" 
       } 
       }, 
       { 
       "type" : { 
        "$eq" : "VERPAKT" 
       } 
       } 
      ] 
      }, 
      "winningPlan" : { 
      "stage" : "COLLSCAN", 
      "filter" : { 
       "$and" : [ 
       { 
        "ras" : { 
        "$eq" : "CherryStar" 
        } 
       }, 
       { 
        "type" : { 
        "$eq" : "VERPAKT" 
        } 
       } 
       ] 
      }, 
      "direction" : "forward" 
      }, 
      "rejectedPlans" : [ 

      ] 
     } 
     } 
    } 
    ], 
    "ok" : NumberInt(1) 
} 

Trong khi

db.verpakking.explain().aggregate([ 
{ "$match": {type: "VERPAKT", ras: "CherryStar"} }, 
]); 

Kết quả trong đầu ra:

{ 
    "waitedMS" : NumberLong(0), 
    "stages" : [ 
    { 
     "$cursor" : { 
     "query" : { 
      "type" : "VERPAKT", 
      "ras" : "CherryStar" 
     }, 
     "queryPlanner" : { 
      "plannerVersion" : NumberInt(1), 
      "namespace" : "denberk.verpakking", 
      "indexFilterSet" : false, 
      "parsedQuery" : { 
      "$and" : [ 
       { 
       "ras" : { 
        "$eq" : "CherryStar" 
       } 
       }, 
       { 
       "type" : { 
        "$eq" : "VERPAKT" 
       } 
       } 
      ] 
      }, 
      "winningPlan" : { 
      "stage" : "COLLSCAN", 
      "filter" : { 
       "$and" : [ 
       { 
        "ras" : { 
        "$eq" : "CherryStar" 
        } 
       }, 
       { 
        "type" : { 
        "$eq" : "VERPAKT" 
        } 
       } 
       ] 
      }, 
      "direction" : "forward" 
      }, 
      "rejectedPlans" : [ 

      ] 
     } 
     } 
    } 
    ], 
    "ok" : NumberInt(1) 
} 

Như bạn có thể thấy đây là giống hệt nhau, ngoại trừ phần "truy vấn" (whi) ch là bình thường, vì truy vấn của chúng tôi khác nhau). Điều này chứng minh rằng liệu bạn có sử dụng hai đường dẫn-trận đấu $ liên tiếp riêng lẻ hay một kết hợp $-đường dẫn kết hợp, truy vấn được phân tích cú pháp sẽ giống hệt nhau.

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