Mongodb Giải thích cho khung Tổng hợp


118

Có chức năng giải thích cho khung Tổng hợp trong MongoDB không? Tôi không thấy nó trong tài liệu.

Nếu không, có một số cách khác để kiểm tra, cách truy vấn hoạt động trong khuôn khổ tổng hợp?

Tôi biết với việc tìm thấy bạn chỉ cần làm

db.collection.find().explain()

Nhưng với khung tổng hợp, tôi gặp lỗi

db.collection.aggregate(
    { $project : { "Tags._id" : 1 }},
    { $unwind : "$Tags" },
    { $match: {$or: [{"Tags._id":"tag1"},{"Tags._id":"tag2"}]}},
    { 
        $group: 
        { 
            _id : { id: "$_id"},
            "count": { $sum:1 } 
        }
    },
    { $sort: {"count":-1}}
).explain()

Câu trả lời:


172

Bắt đầu với MongoDB phiên bản 3.0, chỉ cần thay đổi thứ tự từ

collection.aggregate(...).explain()

đến

collection.explain().aggregate(...)

sẽ cung cấp cho bạn kết quả mong muốn (tài liệu tại đây ).

Đối với các phiên bản cũ hơn> = 2.6, bạn sẽ cần sử dụng explaintùy chọn cho các hoạt động đường ống tổng hợp

explain:true

db.collection.aggregate([
    { $project : { "Tags._id" : 1 }},
    { $unwind : "$Tags" },
    { $match: {$or: [{"Tags._id":"tag1"},{"Tags._id":"tag2"}]}},
    { $group: { 
        _id : "$_id",
        count: { $sum:1 } 
    }},
    {$sort: {"count":-1}}
  ],
  {
    explain:true
  }
)

Một yếu tố quan trọng với khung Aggregation là một chỉ số chỉ có thể được sử dụng để lấy dữ liệu ban đầu cho một đường ống dẫn (ví dụ sử dụng $match, $sort, $geonearvào lúc bắt đầu của một đường ống dẫn) cũng như sau này $lookup$graphLookupgiai đoạn. Khi dữ liệu đã được lấy vào các đường ống dẫn tập hợp để xử lý (ví dụ như đi qua các giai đoạn như $project, $unwind$group) thao tác sẽ tiếp tục được trong bộ nhớ (có thể sử dụng tập tin tạm thời nếu allowDiskUselựa chọn là bộ).

Tối ưu hóa đường ống

Nói chung, bạn có thể tối ưu hóa các đường ống tổng hợp bằng cách:

  • Bắt đầu một đường dẫn với một $matchgiai đoạn để hạn chế xử lý các tài liệu có liên quan.
  • Đảm bảo các giai đoạn $match/ ban đầu $sortđược hỗ trợ bởi một chỉ mục hiệu quả .
  • Dữ liệu lọc đầu sử dụng $match, $limit$skip.
  • Giảm thiểu các giai đoạn không cần thiết và thao tác tài liệu (có thể xem xét lại giản đồ của bạn nếu yêu cầu thể dục tổng hợp phức tạp).
  • Tận dụng các toán tử tổng hợp mới hơn nếu bạn đã nâng cấp máy chủ MongoDB của mình. Ví dụ: MongoDB 3.4 đã thêm nhiều giai đoạn và biểu thức tổng hợp mới bao gồm hỗ trợ làm việc với mảng, chuỗi và khía cạnh.

Ngoài ra còn có một số Tối ưu hóa đường ống tổng hợp tự động xảy ra tùy thuộc vào phiên bản máy chủ MongoDB của bạn. Ví dụ, các giai đoạn liền kề có thể được liên kết và / hoặc sắp xếp lại thứ tự để cải thiện việc thực hiện mà không ảnh hưởng đến kết quả đầu ra.

Hạn chế

Như trong MongoDB 3.4, explaintùy chọn Khung tổng hợp cung cấp thông tin về cách xử lý đường dẫn nhưng không hỗ trợ mức chi tiết giống như executionStatschế độ cho find()truy vấn. Nếu bạn đang tập trung vào việc tối ưu hóa việc thực thi truy vấn ban đầu, bạn có thể sẽ thấy có lợi khi xem lại find().explain()truy vấn tương đương với executionStatshoặc độ allPlansExecutiondài .

Có một số yêu cầu tính năng liên quan để xem / ủng hộ trong trình theo dõi vấn đề MongoDB liên quan đến số liệu thống kê thực thi chi tiết hơn để giúp tối ưu hóa / đường ống tổng hợp hồ sơ:


Cảm ơn vì thông tin sẽ xem liệu tôi có thể thực hiện bất kỳ thay đổi nào không.
SCB

Không nên các $sortđối tượng được bên trong mảng đường ống?
JohnnyHK

@JohnnyHK: Vâng. Một số người tốt bụng đang "sửa" câu trả lời sai :).
Stennie

Nhưng điều này không đưa ra các "executionStats"
Kanagavelu Sugumar

1
@KanagaveluSugumar Tôi đã cập nhật câu trả lời với việc giải thích rõ về các explaingiới hạn của Khung tổng hợp cũng như các yêu cầu tính năng liên quan để có thêm số liệu thống kê thực thi.
Stennie

29

Bắt đầu với phiên bản 2.6.x mongodb cho phép người dùng giải thích với khung tổng hợp .

Tất cả những gì bạn cần làm là thêm giải thích: true

db.records.aggregate(
  [ ...your pipeline...],
  { explain: true }
)

Cảm ơn Rafa, tôi biết rằng có thể làm được điều đó ngay cả trong 2.4, nhưng chỉ là vượt qua runCommand(). Nhưng bây giờ bạn cũng có thể sử dụng tổng hợp.


5
Trên thực tế, bạn có thể giải thích tổng hợp db.collection.runCommand('aggregate', {pipeline: [PIPELINE], explain: true})kể từ MongoDB 2.2.
Rafa

1
Bạn nói đúng, trong 2.2 và 2.4, bạn chỉ có thể giải thích các tổng hợp thông qua runCommand. Cảm ơn vì đã ủng hộ.
Rafa

3
Mặc dù về mặt kỹ thuật, tùy chọn tồn tại thông qua runCommand trước 2.6, nhưng nó không được đảm bảo tạo ra kết quả chính xác và không nên được ủng hộ. Bạn thực sự chỉ nên sử dụng điều này trong phiên bản 2.5.3 hoặc mới hơn (và hy vọng rằng vẫn có thể có một số lỗi ẩn nấp trước bản phát hành sản xuất 2.6).
Stennie

20

Khung tổng hợp

Khung tổng hợp là một tập hợp các công cụ phân tích trong MongoDBđó cho phép chúng tôi chạy các loại báo cáo hoặc phân tích khác nhau trên các tài liệu trong một hoặc nhiều tập hợp. Dựa trên ý tưởng về một đường ống dẫn. Chúng tôi lấy đầu vào từ một MongoDBbộ sưu tập và chuyển các tài liệu từ bộ sưu tập đó qua một hoặc nhiều giai đoạn, mỗi giai đoạn thực hiện một thao tác khác nhau đối với đầu vào của nó. Mỗi giai đoạn coi như đầu vào bất kể giai đoạn trước khi nó được sản xuất như đầu ra. Và đầu vào và đầu ra cho tất cả các giai đoạn là một dòng tài liệu. Mỗi giai đoạn có một công việc cụ thể mà nó thực hiện. Nó mong đợi một dạng tài liệu cụ thể và tạo ra một đầu ra cụ thể, bản thân nó là một luồng tài liệu. Ở cuối đường ống, chúng tôi có quyền truy cập vào đầu ra.

giai đoạn khung tổng hợp

Một giai đoạn riêng lẻ là một đơn vị xử lý dữ liệu. Mỗi giai đoạn lấy đầu vào một luồng tài liệu tại một thời điểm, xử lý từng tài liệu một và tạo ra luồng tài liệu đầu ra. Một lần nữa, từng người một. Mỗi giai đoạn cung cấp một tập hợp các nút bấm hoặc bộ điều chỉnh mà chúng ta có thể điều khiển để tham số hóa giai đoạn đó để thực hiện bất kỳ tác vụ nào chúng ta muốn làm. Vì vậy, một giai đoạn thực hiện một nhiệm vụ chung - một nhiệm vụ mục đích chung của một số loại và tham số hóa giai đoạn cho tập hợp tài liệu cụ thể mà chúng tôi đang làm việc. Và chính xác những gì chúng tôi muốn giai đoạn đó thực hiện với những tài liệu đó. Những bộ thu thập thông tin này thường ở dạng toán tử mà chúng tôi có thể cung cấp sẽ sửa đổi các trường, thực hiện các phép toán số học, định hình lại tài liệu hoặc thực hiện một số loại nhiệm vụ tích lũy cũng như xác minh những thứ khác. Thông thường, trường hợp chúng ta

cùng một loại giai đoạn nhiều lần trong một đường dẫn duy nhất

Ví dụ: Chúng tôi có thể muốn thực hiện một bộ lọc ban đầu để chúng tôi không phải chuyển toàn bộ bộ sưu tập vào đường ống của chúng tôi. Nhưng sau đó, sau một số xử lý bổ sung, muốn lọc lại bằng cách sử dụng một bộ tiêu chí khác. Vì vậy, tóm lại, đường ống hoạt động với một MongoDBtập hợp. Chúng bao gồm các giai đoạn, mỗi giai đoạn thực hiện một nhiệm vụ xử lý dữ liệu khác nhau trên đầu vào của nó và tạo ra tài liệu dưới dạng đầu ra để chuyển sang giai đoạn tiếp theo. Và cuối cùng ở cuối đầu ra của đường ống được tạo ra mà sau đó chúng ta có thể làm điều gì đó trong ứng dụng của mình. Trong nhiều trường hợp, cần phải bao gồm cùng một loại giai đoạn, nhiều lần trong một đường ống riêng lẻ.


cảm ơn, thật hữu ích để hiểu rõ hơn.
Arun Pratap Singh
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.