Hướng dẫn aggregate performance mongodb - hiệu suất tổng hợp mongodb

Trên trang này

  • Tối ưu hóa chiếu
  • Tối ưu hóa trình tự đường ống
  • Tối ưu hóa hợp nhất đường ống
  • Tối ưu hóa công cụ thực thi truy vấn dựa trên khe
  • Cải thiện hiệu suất với các chỉ mục và bộ lọc tài liệu
  • Thí dụ

Các hoạt động đường ống tổng hợp có giai đoạn tối ưu hóa cố gắng định hình lại đường ống để cải thiện hiệu suất.

Để xem trình tối ưu hóa biến đổi một đường ống tổng hợp cụ thể, bao gồm tùy chọn

{ $match: { name: "Joe Schmoe" } },
{ $addFields: {
maxTime: { $max: "$times" },
minTime: { $min: "$times" }
} },
{ $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
{ $project: {
_id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
avgTime: { $avg: ["$maxTime", "$minTime"] }
} },
{ $match: { avgTime: { $gt: 7 } } }
8 trong phương thức
{ $match: { name: "Joe Schmoe" } },
{ $addFields: {
maxTime: { $max: "$times" },
minTime: { $min: "$times" }
} },
{ $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
{ $project: {
_id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
avgTime: { $avg: ["$maxTime", "$minTime"] }
} },
{ $match: { avgTime: { $gt: 7 } } }
9.

Tối ưu hóa có thể thay đổi giữa các bản phát hành.

Ngoài việc tìm hiểu về các tối ưu hóa đường ống tổng hợp được thực hiện trong giai đoạn tối ưu hóa, bạn cũng sẽ thấy cách cải thiện hiệu suất đường ống tổng hợp bằng cách sử dụng các chỉ mục và bộ lọc tài liệu. Xem cải thiện hiệu suất với các chỉ mục và bộ lọc tài liệu.Improve Performance with Indexes and Document Filters.

Đường ống tổng hợp có thể xác định xem nó chỉ yêu cầu một tập hợp con của các trường trong các tài liệu để có được kết quả. Nếu vậy, đường ống sẽ chỉ sử dụng các trường cần thiết đó, giảm lượng dữ liệu đi qua đường ống.

Đối với một đường ống tổng hợp chứa giai đoạn chiếu (

{ $sort: { age : -1 } },
{ $match: { status: 'A' } }
0 hoặc
{ $sort: { age : -1 } },
{ $match: { status: 'A' } }
1 hoặc
{ $sort: { age : -1 } },
{ $match: { status: 'A' } }
2 hoặc
{ $sort: { age : -1 } },
{ $match: { status: 'A' } }
3) sau đó là giai đoạn
{ $sort: { age : -1 } },
{ $match: { status: 'A' } }
4, MongoDB di chuyển bất kỳ bộ lọc nào trong giai đoạn
{ $sort: { age : -1 } },
{ $match: { status: 'A' } }
4 không yêu cầu các giá trị được tính .

Nếu một đường ống tổng hợp chứa nhiều giai đoạn chiếu và/hoặc

{ $sort: { age : -1 } },
{ $match: { status: 'A' } }
4, MongoDB thực hiện tối ưu hóa này cho mỗi giai đoạn
{ $sort: { age : -1 } },
{ $match: { status: 'A' } }
4, việc di chuyển mỗi bộ lọc
{ $sort: { age : -1 } },
{ $match: { status: 'A' } }
4 trước tất cả các giai đoạn chiếu mà bộ lọc không phụ thuộc vào.

Xem xét một đường ống của các giai đoạn sau:

{ $addFields: {
maxTime: { $max: "$times" },
minTime: { $min: "$times" }
} },
{ $project: {
_id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
avgTime: { $avg: ["$maxTime", "$minTime"] }
} },
{ $match: {
name: "Joe Schmoe",
maxTime: { $lt: 20 },
minTime: { $gt: 5 },
avgTime: { $gt: 7 }
} }

Trình tối ưu hóa chia giai đoạn

{ $sort: { age : -1 } },
{ $match: { status: 'A' } }
4 thành bốn bộ lọc riêng lẻ, một cho mỗi khóa trong tài liệu truy vấn
{ $sort: { age : -1 } },
{ $match: { status: 'A' } }
4. Trình tối ưu hóa sau đó di chuyển từng bộ lọc trước càng nhiều giai đoạn chiếu càng tốt, tạo ra các giai đoạn
{ $sort: { age : -1 } },
{ $match: { status: 'A' } }
4 mới khi cần thiết. Đưa ra ví dụ này, trình tối ưu hóa tạo ra đường ống được tối ưu hóa sau:

{ $match: { name: "Joe Schmoe" } },
{ $addFields: {
maxTime: { $max: "$times" },
minTime: { $min: "$times" }
} },
{ $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
{ $project: {
_id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
avgTime: { $avg: ["$maxTime", "$minTime"] }
} },
{ $match: { avgTime: { $gt: 7 } } }

Bộ lọc

{ $sort: { age : -1 } },
{ $match: { status: 'A' } }
4
{ $match: { status: 'A' } },
{ $sort: { age : -1 } }
4 phụ thuộc vào giai đoạn
{ $sort: { age : -1 } },
{ $match: { status: 'A' } }
0 để tính toán trường
{ $match: { status: 'A' } },
{ $sort: { age : -1 } }
6. Giai đoạn
{ $sort: { age : -1 } },
{ $match: { status: 'A' } }
0 là giai đoạn chiếu cuối cùng trong đường ống này, do đó, bộ lọc
{ $sort: { age : -1 } },
{ $match: { status: 'A' } }
4 trên
{ $match: { status: 'A' } },
{ $sort: { age : -1 } }
6 không thể được di chuyển.

Các trường

{ $redact: { $cond: { if: { $eq: [ "$level", 5 ] }, then: "$$PRUNE", else: "$$DESCEND" } } },
{ $match: { year: 2014, category: { $ne: "Z" } } }
0 và
{ $redact: { $cond: { if: { $eq: [ "$level", 5 ] }, then: "$$PRUNE", else: "$$DESCEND" } } },
{ $match: { year: 2014, category: { $ne: "Z" } } }
1 được tính toán trong giai đoạn
{ $sort: { age : -1 } },
{ $match: { status: 'A' } }
2 nhưng không có sự phụ thuộc vào giai đoạn
{ $sort: { age : -1 } },
{ $match: { status: 'A' } }
0. Trình tối ưu hóa đã tạo ra một giai đoạn
{ $sort: { age : -1 } },
{ $match: { status: 'A' } }
4 mới cho các bộ lọc trên các trường này và đặt nó trước giai đoạn
{ $sort: { age : -1 } },
{ $match: { status: 'A' } }
0.

Bộ lọc

{ $sort: { age : -1 } },
{ $match: { status: 'A' } }
4
{ $redact: { $cond: { if: { $eq: [ "$level", 5 ] }, then: "$$PRUNE", else: "$$DESCEND" } } },
{ $match: { year: 2014, category: { $ne: "Z" } } }
7 không sử dụng bất kỳ giá trị nào được tính toán trong các giai đoạn
{ $sort: { age : -1 } },
{ $match: { status: 'A' } }
0 hoặc
{ $sort: { age : -1 } },
{ $match: { status: 'A' } }
2 để nó được chuyển sang giai đoạn ____24 mới trước cả hai giai đoạn chiếu.

Ghi chú

Sau khi tối ưu hóa, bộ lọc

{ $redact: { $cond: { if: { $eq: [ "$level", 5 ] }, then: "$$PRUNE", else: "$$DESCEND" } } },
{ $match: { year: 2014, category: { $ne: "Z" } } }
7 đang ở giai đoạn
{ $sort: { age : -1 } },
{ $match: { status: 'A' } }
4 khi bắt đầu đường ống. Điều này có thêm lợi ích là cho phép tập hợp sử dụng chỉ mục trên trường
{ $match: { year: 2014 } },
{ $redact: { $cond: { if: { $eq: [ "$level", 5 ] }, then: "$$PRUNE", else: "$$DESCEND" } } },
{ $match: { year: 2014, category: { $ne: "Z" } } }
3 khi ban đầu truy vấn bộ sưu tập. Xem cải thiện hiệu suất với các chỉ mục và bộ lọc tài liệu để biết thêm thông tin.Improve Performance with Indexes and Document Filters for more information.

Khi bạn có một chuỗi với

{ $match: { year: 2014 } },
{ $redact: { $cond: { if: { $eq: [ "$level", 5 ] }, then: "$$PRUNE", else: "$$DESCEND" } } },
{ $match: { year: 2014, category: { $ne: "Z" } } }
4, sau đó là
{ $sort: { age : -1 } },
{ $match: { status: 'A' } }
4,
{ $sort: { age : -1 } },
{ $match: { status: 'A' } }
4 di chuyển trước
{ $match: { year: 2014 } },
{ $redact: { $cond: { if: { $eq: [ "$level", 5 ] }, then: "$$PRUNE", else: "$$DESCEND" } } },
{ $match: { year: 2014, category: { $ne: "Z" } } }
4 để giảm thiểu số lượng đối tượng để sắp xếp. Ví dụ: nếu đường ống bao gồm các giai đoạn sau:

{ $sort: { age : -1 } },
{ $match: { status: 'A' } }

Trong giai đoạn tối ưu hóa, trình tối ưu hóa chuyển đổi trình tự thành phần sau:

{ $match: { status: 'A' } },
{ $sort: { age : -1 } }

Khi có thể, khi đường ống có giai đoạn

{ $match: { year: 2014 } },
{ $redact: { $cond: { if: { $eq: [ "$level", 5 ] }, then: "$$PRUNE", else: "$$DESCEND" } } },
{ $match: { year: 2014, category: { $ne: "Z" } } }
8 ngay sau đó là giai đoạn
{ $sort: { age : -1 } },
{ $match: { status: 'A' } }
4, tổng hợp đôi khi có thể thêm một phần của giai đoạn
{ $sort: { age : -1 } },
{ $match: { status: 'A' } }
4 trước giai đoạn
{ $match: { year: 2014 } },
{ $redact: { $cond: { if: { $eq: [ "$level", 5 ] }, then: "$$PRUNE", else: "$$DESCEND" } } },
{ $match: { year: 2014, category: { $ne: "Z" } } }
8. Nếu giai đoạn
{ $sort: { age : -1 } },
{ $match: { status: 'A' } }
4 được thêm vào khi bắt đầu đường ống, tập hợp có thể sử dụng một chỉ mục cũng như truy vấn bộ sưu tập để giới hạn số lượng tài liệu đi vào đường ống. Xem cải thiện hiệu suất với các chỉ mục và bộ lọc tài liệu để biết thêm thông tin.Improve Performance with Indexes and Document Filters for more information.

Ví dụ: nếu đường ống bao gồm các giai đoạn sau:

{ $redact: { $cond: { if: { $eq: [ "$level", 5 ] }, then: "$$PRUNE", else: "$$DESCEND" } } },
{ $match: { year: 2014, category: { $ne: "Z" } } }

Trình tối ưu hóa có thể thêm cùng giai đoạn

{ $sort: { age : -1 } },
{ $match: { status: 'A' } }
4 trước giai đoạn
{ $match: { year: 2014 } },
{ $redact: { $cond: { if: { $eq: [ "$level", 5 ] }, then: "$$PRUNE", else: "$$DESCEND" } } },
{ $match: { year: 2014, category: { $ne: "Z" } } }
8:

{ $match: { year: 2014 } },
{ $redact: { $cond: { if: { $eq: [ "$level", 5 ] }, then: "$$PRUNE", else: "$$DESCEND" } } },
{ $match: { year: 2014, category: { $ne: "Z" } } }

Khi bạn có một chuỗi với

{ $sort: { age : -1 } },
{ $match: { status: 'A' } }
0 hoặc
{ $sort: { age : -1 } },
{ $match: { status: 'A' } }
1 sau đó là
{ $sort: { age : -1 } },
{ $project: { status: 1, name: 1 } },
{ $skip: 5 }
7,
{ $sort: { age : -1 } },
{ $project: { status: 1, name: 1 } },
{ $skip: 5 }
7 di chuyển trước
{ $sort: { age : -1 } },
{ $match: { status: 'A' } }
0. Ví dụ: nếu đường ống bao gồm các giai đoạn sau:

{ $sort: { age : -1 } },
{ $project: { status: 1, name: 1 } },
{ $skip: 5 }

Trong giai đoạn tối ưu hóa, trình tối ưu hóa chuyển đổi trình tự thành phần sau:

{ $sort: { age : -1 } },
{ $skip: 5 },
{ $project: { status: 1, name: 1 } }

Khi có thể, khi đường ống có giai đoạn

{ $match: { year: 2014 } },
{ $redact: { $cond: { if: { $eq: [ "$level", 5 ] }, then: "$$PRUNE", else: "$$DESCEND" } } },
{ $match: { year: 2014, category: { $ne: "Z" } } }
8 ngay sau đó là giai đoạn
{ $sort: { age : -1 } },
{ $match: { status: 'A' } }
4, tổng hợp đôi khi có thể thêm một phần của giai đoạn
{ $sort: { age : -1 } },
{ $match: { status: 'A' } }
4 trước giai đoạn
{ $match: { year: 2014 } },
{ $redact: { $cond: { if: { $eq: [ "$level", 5 ] }, then: "$$PRUNE", else: "$$DESCEND" } } },
{ $match: { year: 2014, category: { $ne: "Z" } } }
8. Nếu giai đoạn
{ $sort: { age : -1 } },
{ $match: { status: 'A' } }
4 được thêm vào khi bắt đầu đường ống, tập hợp có thể sử dụng một chỉ mục cũng như truy vấn bộ sưu tập để giới hạn số lượng tài liệu đi vào đường ống. Xem cải thiện hiệu suất với các chỉ mục và bộ lọc tài liệu để biết thêm thông tin.

Ví dụ: nếu đường ống bao gồm các giai đoạn sau:

Trình tối ưu hóa có thể thêm cùng giai đoạn

{ $sort: { age : -1 } },
{ $match: { status: 'A' } }
4 trước giai đoạn
{ $match: { year: 2014 } },
{ $redact: { $cond: { if: { $eq: [ "$level", 5 ] }, then: "$$PRUNE", else: "$$DESCEND" } } },
{ $match: { year: 2014, category: { $ne: "Z" } } }
8:

Ví dụ: nếu đường ống bao gồm các giai đoạn sau:

{ $sort : { age : -1 } },
{ $project : { age : 1, status : 1, name : 1 } },
{ $limit: 5 }

Trong giai đoạn tối ưu hóa, trình tối ưu hóa kết hợp trình tự sau:

{
"$sort" : {
"sortKey" : {
"age" : -1
},
"limit" : NumberLong(5)
}
},
{ "$project" : {
"age" : 1,
"status" : 1,
"name" : 1
}
}

Điều này cho phép hoạt động sắp xếp chỉ duy trì kết quả

{ $sort : { age : -1 } },
{ $project : { age : 1, status : 1, name : 1 } },
{ $limit: 5 }
0 hàng đầu khi nó tiến triển, trong đó
{ $sort : { age : -1 } },
{ $project : { age : 1, status : 1, name : 1 } },
{ $limit: 5 }
0 là giới hạn được chỉ định và MongoDB chỉ cần lưu trữ các mục
{ $sort : { age : -1 } },
{ $project : { age : 1, status : 1, name : 1 } },
{ $limit: 5 }
0 trong bộ nhớ [1]. Xem toán tử và bộ nhớ
{ $match: { year: 2014 } },
{ $redact: { $cond: { if: { $eq: [ "$level", 5 ] }, then: "$$PRUNE", else: "$$DESCEND" } } },
{ $match: { year: 2014, category: { $ne: "Z" } } }
4 để biết thêm thông tin.

Ghi chú

Tối ưu hóa trình tự với $ bỏ qua

Khi một

{ $sort: { age : -1 } },
{ $skip: 5 },
{ $project: { status: 1, name: 1 } }
1 ngay lập tức theo một
{ $sort: { age : -1 } },
{ $skip: 5 },
{ $project: { status: 1, name: 1 } }
1 khác, hai giai đoạn có thể hợp nhất thành một
{ $sort: { age : -1 } },
{ $skip: 5 },
{ $project: { status: 1, name: 1 } }
1 trong đó số lượng giới hạn nhỏ hơn trong hai lượng giới hạn ban đầu. Ví dụ: một đường ống chứa chuỗi sau:

{ $match: { name: "Joe Schmoe" } },
{ $addFields: {
maxTime: { $max: "$times" },
minTime: { $min: "$times" }
} },
{ $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
{ $project: {
_id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
avgTime: { $avg: ["$maxTime", "$minTime"] }
} },
{ $match: { avgTime: { $gt: 7 } } }
0

Sau đó, giai đoạn

{ $sort: { age : -1 } },
{ $skip: 5 },
{ $project: { status: 1, name: 1 } }
1 thứ hai có thể hợp nhất vào giai đoạn
{ $sort: { age : -1 } },
{ $skip: 5 },
{ $project: { status: 1, name: 1 } }
1 đầu tiên và dẫn đến một giai đoạn
{ $sort: { age : -1 } },
{ $skip: 5 },
{ $project: { status: 1, name: 1 } }
1 duy nhất trong đó số lượng giới hạn
{
"$sort" : {
"sortKey" : {
"age" : -1
},
"limit" : NumberLong(5)
}
},
{ "$project" : {
"age" : 1,
"status" : 1,
"name" : 1
}
}
0 là tối thiểu của hai giới hạn ban đầu
{
"$sort" : {
"sortKey" : {
"age" : -1
},
"limit" : NumberLong(5)
}
},
{ "$project" : {
"age" : 1,
"status" : 1,
"name" : 1
}
}
1 và
{
"$sort" : {
"sortKey" : {
"age" : -1
},
"limit" : NumberLong(5)
}
},
{ "$project" : {
"age" : 1,
"status" : 1,
"name" : 1
}
}
0.

Khi một

{ $sort: { age : -1 } },
{ $project: { status: 1, name: 1 } },
{ $skip: 5 }
7 ngay lập tức theo một
{ $sort: { age : -1 } },
{ $project: { status: 1, name: 1 } },
{ $skip: 5 }
7 khác, hai giai đoạn có thể hợp nhất thành một
{ $sort: { age : -1 } },
{ $project: { status: 1, name: 1 } },
{ $skip: 5 }
7 trong đó số lượng bỏ qua là tổng của hai lượng bỏ qua ban đầu. Ví dụ: một đường ống chứa chuỗi sau:

{ $match: { name: "Joe Schmoe" } },
{ $addFields: {
maxTime: { $max: "$times" },
minTime: { $min: "$times" }
} },
{ $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
{ $project: {
_id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
avgTime: { $avg: ["$maxTime", "$minTime"] }
} },
{ $match: { avgTime: { $gt: 7 } } }
1

Sau đó, giai đoạn

{ $sort: { age : -1 } },
{ $project: { status: 1, name: 1 } },
{ $skip: 5 }
7 thứ hai có thể hợp nhất vào giai đoạn
{ $sort: { age : -1 } },
{ $project: { status: 1, name: 1 } },
{ $skip: 5 }
7 đầu tiên và dẫn đến một giai đoạn
{ $sort: { age : -1 } },
{ $project: { status: 1, name: 1 } },
{ $skip: 5 }
7 duy nhất trong đó số lượng bỏ qua
{
"$sort" : {
"sortKey" : {
"age" : -1
},
"limit" : NumberLong(5)
}
},
{ "$project" : {
"age" : 1,
"status" : 1,
"name" : 1
}
}
9 là tổng của hai giới hạn ban đầu
{ $match: { name: "Joe Schmoe" } },
{ $addFields: {
maxTime: { $max: "$times" },
minTime: { $min: "$times" }
} },
{ $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
{ $project: {
_id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
avgTime: { $avg: ["$maxTime", "$minTime"] }
} },
{ $match: { avgTime: { $gt: 7 } } }
00 và
{ $match: { name: "Joe Schmoe" } },
{ $addFields: {
maxTime: { $max: "$times" },
minTime: { $min: "$times" }
} },
{ $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
{ $project: {
_id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
avgTime: { $avg: ["$maxTime", "$minTime"] }
} },
{ $match: { avgTime: { $gt: 7 } } }
01.

Khi một

{ $sort: { age : -1 } },
{ $match: { status: 'A' } }
4 ngay lập tức theo một
{ $sort: { age : -1 } },
{ $match: { status: 'A' } }
4 khác, hai giai đoạn có thể hợp nhất thành một
{ $sort: { age : -1 } },
{ $match: { status: 'A' } }
4 kết hợp các điều kiện với
{ $match: { name: "Joe Schmoe" } },
{ $addFields: {
maxTime: { $max: "$times" },
minTime: { $min: "$times" }
} },
{ $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
{ $project: {
_id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
avgTime: { $avg: ["$maxTime", "$minTime"] }
} },
{ $match: { avgTime: { $gt: 7 } } }
05. Ví dụ: một đường ống chứa chuỗi sau:

{ $match: { name: "Joe Schmoe" } },
{ $addFields: {
maxTime: { $max: "$times" },
minTime: { $min: "$times" }
} },
{ $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
{ $project: {
_id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
avgTime: { $avg: ["$maxTime", "$minTime"] }
} },
{ $match: { avgTime: { $gt: 7 } } }
2

Sau đó, giai đoạn

{ $sort: { age : -1 } },
{ $match: { status: 'A' } }
4 thứ hai có thể hợp nhất vào giai đoạn
{ $sort: { age : -1 } },
{ $match: { status: 'A' } }
4 đầu tiên và dẫn đến một giai đoạn
{ $sort: { age : -1 } },
{ $match: { status: 'A' } }
4 duy nhất

{ $match: { name: "Joe Schmoe" } },
{ $addFields: {
maxTime: { $max: "$times" },
minTime: { $min: "$times" }
} },
{ $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
{ $project: {
_id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
avgTime: { $avg: ["$maxTime", "$minTime"] }
} },
{ $match: { avgTime: { $gt: 7 } } }
3

Khi

{ $sort: { age : -1 } },
{ $skip: 5 },
{ $project: { status: 1, name: 1 } }
4 ngay lập tức theo một
{ $match: { name: "Joe Schmoe" } },
{ $addFields: {
maxTime: { $max: "$times" },
minTime: { $min: "$times" }
} },
{ $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
{ $project: {
_id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
avgTime: { $avg: ["$maxTime", "$minTime"] }
} },
{ $match: { avgTime: { $gt: 7 } } }
10 khác và
{ $sort: { age : -1 } },
{ $skip: 5 },
{ $project: { status: 1, name: 1 } }
4 hoạt động trên trường
{ $match: { name: "Joe Schmoe" } },
{ $addFields: {
maxTime: { $max: "$times" },
minTime: { $min: "$times" }
} },
{ $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
{ $project: {
_id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
avgTime: { $avg: ["$maxTime", "$minTime"] }
} },
{ $match: { avgTime: { $gt: 7 } } }
12 của
{ $match: { name: "Joe Schmoe" } },
{ $addFields: {
maxTime: { $max: "$times" },
minTime: { $min: "$times" }
} },
{ $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
{ $project: {
_id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
avgTime: { $avg: ["$maxTime", "$minTime"] }
} },
{ $match: { avgTime: { $gt: 7 } } }
10, trình tối ưu hóa có thể hợp lại
{ $sort: { age : -1 } },
{ $skip: 5 },
{ $project: { status: 1, name: 1 } }
4 vào giai đoạn
{ $match: { name: "Joe Schmoe" } },
{ $addFields: {
maxTime: { $max: "$times" },
minTime: { $min: "$times" }
} },
{ $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
{ $project: {
_id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
avgTime: { $avg: ["$maxTime", "$minTime"] }
} },
{ $match: { avgTime: { $gt: 7 } } }
10. Điều này tránh tạo ra các tài liệu trung gian lớn.

Ví dụ: một đường ống chứa chuỗi sau:

{ $match: { name: "Joe Schmoe" } },
{ $addFields: {
maxTime: { $max: "$times" },
minTime: { $min: "$times" }
} },
{ $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
{ $project: {
_id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
avgTime: { $avg: ["$maxTime", "$minTime"] }
} },
{ $match: { avgTime: { $gt: 7 } } }
4

Trình tối ưu hóa có thể hợp nhất giai đoạn

{ $sort: { age : -1 } },
{ $skip: 5 },
{ $project: { status: 1, name: 1 } }
4 vào giai đoạn
{ $match: { name: "Joe Schmoe" } },
{ $addFields: {
maxTime: { $max: "$times" },
minTime: { $min: "$times" }
} },
{ $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
{ $project: {
_id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
avgTime: { $avg: ["$maxTime", "$minTime"] }
} },
{ $match: { avgTime: { $gt: 7 } } }
10. Nếu bạn chạy tập hợp với tùy chọn
{ $match: { name: "Joe Schmoe" } },
{ $addFields: {
maxTime: { $max: "$times" },
minTime: { $min: "$times" }
} },
{ $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
{ $project: {
_id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
avgTime: { $avg: ["$maxTime", "$minTime"] }
} },
{ $match: { avgTime: { $gt: 7 } } }
8, sản lượng
{ $match: { name: "Joe Schmoe" } },
{ $addFields: {
maxTime: { $max: "$times" },
minTime: { $min: "$times" }
} },
{ $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
{ $project: {
_id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
avgTime: { $avg: ["$maxTime", "$minTime"] }
} },
{ $match: { avgTime: { $gt: 7 } } }
8 cho thấy giai đoạn kết hợp:

{ $match: { name: "Joe Schmoe" } },
{ $addFields: {
maxTime: { $max: "$times" },
minTime: { $min: "$times" }
} },
{ $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
{ $project: {
_id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
avgTime: { $avg: ["$maxTime", "$minTime"] }
} },
{ $match: { avgTime: { $gt: 7 } } }
5

MongoDB có thể sử dụng công cụ thực thi truy vấn dựa trên khe để thực hiện các giai đoạn đường ống nhất định khi đáp ứng các điều kiện cụ thể. Trong hầu hết các trường hợp, động cơ dựa trên khe cung cấp hiệu suất được cải thiện và chi phí CPU và bộ nhớ thấp hơn so với công cụ truy vấn cổ điển.

Để xác minh rằng động cơ dựa trên khe được sử dụng, hãy chạy tập hợp với tùy chọn

{ $match: { name: "Joe Schmoe" } },
{ $addFields: {
maxTime: { $max: "$times" },
minTime: { $min: "$times" }
} },
{ $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
{ $project: {
_id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
avgTime: { $avg: ["$maxTime", "$minTime"] }
} },
{ $match: { avgTime: { $gt: 7 } } }
8. Tùy chọn này đưa ra thông tin về kế hoạch truy vấn của tổng hợp. Để biết thêm thông tin về việc sử dụng
{ $match: { name: "Joe Schmoe" } },
{ $addFields: {
maxTime: { $max: "$times" },
minTime: { $min: "$times" }
} },
{ $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
{ $project: {
_id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
avgTime: { $avg: ["$maxTime", "$minTime"] }
} },
{ $match: { avgTime: { $gt: 7 } } }
8 với các tập hợp, hãy xem thông tin trả lại về hoạt động đường ống tổng hợp.

Các phần sau mô tả:

  • Các điều kiện khi động cơ dựa trên khe được sử dụng để tổng hợp.

  • Cách xác minh nếu động cơ dựa trên khe được sử dụng.

Mới trong phiên bản 5.2.

Bắt đầu từ phiên bản 5.2, MongoDB sử dụng công cụ truy vấn thực thi dựa trên khe để thực thi các giai đoạn

{ $sort: { age : -1 } },
{ $skip: 5 },
{ $project: { status: 1, name: 1 } }
5 nếu một trong hai:

  • { $sort: { age : -1 } },
    { $skip: 5 },
    { $project: { status: 1, name: 1 } }
    5 là giai đoạn đầu tiên trong đường ống.

  • Tất cả các giai đoạn trước trong đường ống cũng có thể được thực hiện bởi động cơ dựa trên khe.

Khi công cụ thực thi truy vấn dựa trên khe được sử dụng cho

{ $sort: { age : -1 } },
{ $skip: 5 },
{ $project: { status: 1, name: 1 } }
5, kết quả giải thích bao gồm:

  • { $match: { name: "Joe Schmoe" } },
    { $addFields: {
    maxTime: { $max: "$times" },
    minTime: { $min: "$times" }
    } },
    { $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
    { $project: {
    _id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
    avgTime: { $avg: ["$maxTime", "$minTime"] }
    } },
    { $match: { avgTime: { $gt: 7 } } }
    25

  • { $match: { name: "Joe Schmoe" } },
    { $addFields: {
    maxTime: { $max: "$times" },
    minTime: { $min: "$times" }
    } },
    { $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
    { $project: {
    _id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
    avgTime: { $avg: ["$maxTime", "$minTime"] }
    } },
    { $match: { avgTime: { $gt: 7 } } }
    26

    Vị trí của đối tượng

    { $match: { name: "Joe Schmoe" } },
    { $addFields: {
    maxTime: { $max: "$times" },
    minTime: { $min: "$times" }
    } },
    { $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
    { $project: {
    _id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
    avgTime: { $avg: ["$maxTime", "$minTime"] }
    } },
    { $match: { avgTime: { $gt: 7 } } }
    27 phụ thuộc vào việc đường ống có chứa các giai đoạn sau giai đoạn
    { $sort: { age : -1 } },
    { $skip: 5 },
    { $project: { status: 1, name: 1 } }
    5 không thể được thực thi bằng động cơ dựa trên khe.

    • Nếu

      { $sort: { age : -1 } },
      { $skip: 5 },
      { $project: { status: 1, name: 1 } }
      5 là giai đoạn cuối hoặc tất cả các giai đoạn sau khi
      { $sort: { age : -1 } },
      { $skip: 5 },
      { $project: { status: 1, name: 1 } }
      5 có thể được thực thi bằng công cụ dựa trên khe, đối tượng
      { $match: { name: "Joe Schmoe" } },
      { $addFields: {
      maxTime: { $max: "$times" },
      minTime: { $min: "$times" }
      } },
      { $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
      { $project: {
      _id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
      avgTime: { $avg: ["$maxTime", "$minTime"] }
      } },
      { $match: { avgTime: { $gt: 7 } } }
      27 nằm trong đối tượng đầu ra cấp cao nhất (
      { $match: { name: "Joe Schmoe" } },
      { $addFields: {
      maxTime: { $max: "$times" },
      minTime: { $min: "$times" }
      } },
      { $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
      { $project: {
      _id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
      avgTime: { $avg: ["$maxTime", "$minTime"] }
      } },
      { $match: { avgTime: { $gt: 7 } } }
      33).

    • Nếu đường ống chứa các giai đoạn sau

      { $sort: { age : -1 } },
      { $skip: 5 },
      { $project: { status: 1, name: 1 } }
      5 không thể được thực thi bằng công cụ dựa trên khe, đối tượng
      { $match: { name: "Joe Schmoe" } },
      { $addFields: {
      maxTime: { $max: "$times" },
      minTime: { $min: "$times" }
      } },
      { $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
      { $project: {
      _id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
      avgTime: { $avg: ["$maxTime", "$minTime"] }
      } },
      { $match: { avgTime: { $gt: 7 } } }
      27 nằm trong
      { $match: { name: "Joe Schmoe" } },
      { $addFields: {
      maxTime: { $max: "$times" },
      minTime: { $min: "$times" }
      } },
      { $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
      { $project: {
      _id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
      avgTime: { $avg: ["$maxTime", "$minTime"] }
      } },
      { $match: { avgTime: { $gt: 7 } } }
      36.

Mới trong phiên bản 6.0.

Bắt đầu từ phiên bản 6.0, MongoDB có thể sử dụng công cụ truy vấn thực thi dựa trên khe để thực hiện các giai đoạn

{ $match: { name: "Joe Schmoe" } },
{ $addFields: {
maxTime: { $max: "$times" },
minTime: { $min: "$times" }
} },
{ $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
{ $project: {
_id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
avgTime: { $avg: ["$maxTime", "$minTime"] }
} },
{ $match: { avgTime: { $gt: 7 } } }
10 nếu tất cả các giai đoạn trước trong đường ống cũng có thể được thực hiện bởi động cơ dựa trên khe và không có điều kiện nào sau đây là đúng:

  • Hoạt động

    { $match: { name: "Joe Schmoe" } },
    { $addFields: {
    maxTime: { $max: "$times" },
    minTime: { $min: "$times" }
    } },
    { $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
    { $project: {
    _id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
    avgTime: { $avg: ["$maxTime", "$minTime"] }
    } },
    { $match: { avgTime: { $gt: 7 } } }
    10 thực hiện một đường ống trên một bộ sưu tập đã tham gia. Để xem một ví dụ về loại hoạt động này, hãy xem các điều kiện tham gia và các nhóm phụ trên một bộ sưu tập được tham gia.

  • ________ 110's

    { $match: { name: "Joe Schmoe" } },
    { $addFields: {
    maxTime: { $max: "$times" },
    minTime: { $min: "$times" }
    } },
    { $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
    { $project: {
    _id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
    avgTime: { $avg: ["$maxTime", "$minTime"] }
    } },
    { $match: { avgTime: { $gt: 7 } } }
    40 hoặc
    { $match: { name: "Joe Schmoe" } },
    { $addFields: {
    maxTime: { $max: "$times" },
    minTime: { $min: "$times" }
    } },
    { $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
    { $project: {
    _id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
    avgTime: { $avg: ["$maxTime", "$minTime"] }
    } },
    { $match: { avgTime: { $gt: 7 } } }
    41 Chỉ định các thành phần số. Ví dụ:
    { $match: { name: "Joe Schmoe" } },
    { $addFields: {
    maxTime: { $max: "$times" },
    minTime: { $min: "$times" }
    } },
    { $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
    { $project: {
    _id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
    avgTime: { $avg: ["$maxTime", "$minTime"] }
    } },
    { $match: { avgTime: { $gt: 7 } } }
    42.

  • Trường

    { $match: { name: "Joe Schmoe" } },
    { $addFields: {
    maxTime: { $max: "$times" },
    minTime: { $min: "$times" }
    } },
    { $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
    { $project: {
    _id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
    avgTime: { $avg: ["$maxTime", "$minTime"] }
    } },
    { $match: { avgTime: { $gt: 7 } } }
    43 của bất kỳ
    { $match: { name: "Joe Schmoe" } },
    { $addFields: {
    maxTime: { $max: "$times" },
    minTime: { $min: "$times" }
    } },
    { $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
    { $project: {
    _id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
    avgTime: { $avg: ["$maxTime", "$minTime"] }
    } },
    { $match: { avgTime: { $gt: 7 } } }
    10 trong đường ống chỉ định một chế độ xem hoặc bộ sưu tập bị che khuất.

Khi công cụ thực thi truy vấn dựa trên khe được sử dụng cho

{ $match: { name: "Joe Schmoe" } },
{ $addFields: {
maxTime: { $max: "$times" },
minTime: { $min: "$times" }
} },
{ $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
{ $project: {
_id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
avgTime: { $avg: ["$maxTime", "$minTime"] }
} },
{ $match: { avgTime: { $gt: 7 } } }
10, kết quả giải thích bao gồm:

  • { $match: { name: "Joe Schmoe" } },
    { $addFields: {
    maxTime: { $max: "$times" },
    minTime: { $min: "$times" }
    } },
    { $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
    { $project: {
    _id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
    avgTime: { $avg: ["$maxTime", "$minTime"] }
    } },
    { $match: { avgTime: { $gt: 7 } } }
    25

  • { $match: { name: "Joe Schmoe" } },
    { $addFields: {
    maxTime: { $max: "$times" },
    minTime: { $min: "$times" }
    } },
    { $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
    { $project: {
    _id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
    avgTime: { $avg: ["$maxTime", "$minTime"] }
    } },
    { $match: { avgTime: { $gt: 7 } } }
    47.
    { $match: { name: "Joe Schmoe" } },
    { $addFields: {
    maxTime: { $max: "$times" },
    minTime: { $min: "$times" }
    } },
    { $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
    { $project: {
    _id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
    avgTime: { $avg: ["$maxTime", "$minTime"] }
    } },
    { $match: { avgTime: { $gt: 7 } } }
    48 có nghĩa là "Tra cứu bình đẳng".

    Vị trí của đối tượng

    { $match: { name: "Joe Schmoe" } },
    { $addFields: {
    maxTime: { $max: "$times" },
    minTime: { $min: "$times" }
    } },
    { $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
    { $project: {
    _id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
    avgTime: { $avg: ["$maxTime", "$minTime"] }
    } },
    { $match: { avgTime: { $gt: 7 } } }
    27 phụ thuộc vào việc đường ống có chứa các giai đoạn sau giai đoạn
    { $match: { name: "Joe Schmoe" } },
    { $addFields: {
    maxTime: { $max: "$times" },
    minTime: { $min: "$times" }
    } },
    { $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
    { $project: {
    _id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
    avgTime: { $avg: ["$maxTime", "$minTime"] }
    } },
    { $match: { avgTime: { $gt: 7 } } }
    10 không thể được thực thi bằng động cơ dựa trên khe.

    • Nếu

      { $match: { name: "Joe Schmoe" } },
      { $addFields: {
      maxTime: { $max: "$times" },
      minTime: { $min: "$times" }
      } },
      { $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
      { $project: {
      _id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
      avgTime: { $avg: ["$maxTime", "$minTime"] }
      } },
      { $match: { avgTime: { $gt: 7 } } }
      10 là giai đoạn cuối hoặc tất cả các giai đoạn sau khi
      { $match: { name: "Joe Schmoe" } },
      { $addFields: {
      maxTime: { $max: "$times" },
      minTime: { $min: "$times" }
      } },
      { $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
      { $project: {
      _id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
      avgTime: { $avg: ["$maxTime", "$minTime"] }
      } },
      { $match: { avgTime: { $gt: 7 } } }
      10 có thể được thực thi bằng công cụ dựa trên khe, đối tượng
      { $match: { name: "Joe Schmoe" } },
      { $addFields: {
      maxTime: { $max: "$times" },
      minTime: { $min: "$times" }
      } },
      { $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
      { $project: {
      _id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
      avgTime: { $avg: ["$maxTime", "$minTime"] }
      } },
      { $match: { avgTime: { $gt: 7 } } }
      27 nằm trong đối tượng đầu ra cấp cao nhất (
      { $match: { name: "Joe Schmoe" } },
      { $addFields: {
      maxTime: { $max: "$times" },
      minTime: { $min: "$times" }
      } },
      { $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
      { $project: {
      _id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
      avgTime: { $avg: ["$maxTime", "$minTime"] }
      } },
      { $match: { avgTime: { $gt: 7 } } }
      33).

    • Nếu đường ống chứa các giai đoạn sau

      { $match: { name: "Joe Schmoe" } },
      { $addFields: {
      maxTime: { $max: "$times" },
      minTime: { $min: "$times" }
      } },
      { $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
      { $project: {
      _id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
      avgTime: { $avg: ["$maxTime", "$minTime"] }
      } },
      { $match: { avgTime: { $gt: 7 } } }
      10 không thể được thực thi bằng công cụ dựa trên khe, đối tượng
      { $match: { name: "Joe Schmoe" } },
      { $addFields: {
      maxTime: { $max: "$times" },
      minTime: { $min: "$times" }
      } },
      { $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
      { $project: {
      _id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
      avgTime: { $avg: ["$maxTime", "$minTime"] }
      } },
      { $match: { avgTime: { $gt: 7 } } }
      27 nằm trong
      { $match: { name: "Joe Schmoe" } },
      { $addFields: {
      maxTime: { $max: "$times" },
      minTime: { $min: "$times" }
      } },
      { $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
      { $project: {
      _id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
      avgTime: { $avg: ["$maxTime", "$minTime"] }
      } },
      { $match: { avgTime: { $gt: 7 } } }
      36.

Các phần sau đây cho thấy cách bạn có thể cải thiện hiệu suất tổng hợp bằng cách sử dụng các chỉ mục và bộ lọc tài liệu.

Truy vấn Planner phân tích một đường ống tổng hợp để xác định xem các chỉ mục có thể được sử dụng để cải thiện hiệu suất đường ống hay không.

Danh sách sau đây cho thấy một số giai đoạn đường ống có thể sử dụng các chỉ mục:

{ $sort: { age : -1 } },
{ $match: { status: 'A' } }
4 Giai đoạn ____24 có thể sử dụng một chỉ số để lọc các tài liệu nếu
{ $sort: { age : -1 } },
{ $match: { status: 'A' } }
4 là giai đoạn đầu tiên trong đường ống.

{ $sort: { age : -1 } },
{ $skip: 5 },
{ $project: { status: 1, name: 1 } }
5 có khả năng sử dụng chỉ mục để tìm tài liệu đầu tiên trong mỗi nhóm nếu:

  • { $sort: { age : -1 } },
    { $skip: 5 },
    { $project: { status: 1, name: 1 } }
    5 đi trước
    { $match: { year: 2014 } },
    { $redact: { $cond: { if: { $eq: [ "$level", 5 ] }, then: "$$PRUNE", else: "$$DESCEND" } } },
    { $match: { year: 2014, category: { $ne: "Z" } } }
    4 sắp xếp các trường theo nhóm theo và

  • Có một chỉ mục trên trường được nhóm phù hợp với thứ tự sắp xếp và

  • { $match: { name: "Joe Schmoe" } },
    { $addFields: {
    maxTime: { $max: "$times" },
    minTime: { $min: "$times" }
    } },
    { $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
    { $project: {
    _id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
    avgTime: { $avg: ["$maxTime", "$minTime"] }
    } },
    { $match: { avgTime: { $gt: 7 } } }
    72 là bộ tích lũy duy nhất trong
    { $sort: { age : -1 } },
    { $skip: 5 },
    { $project: { status: 1, name: 1 } }
    5

Xem

{ $sort: { age : -1 } },
{ $skip: 5 },
{ $project: { status: 1, name: 1 } }
5 Tối ưu hóa hiệu suất cho một ví dụ.

{ $match: { name: "Joe Schmoe" } },
{ $addFields: {
maxTime: { $max: "$times" },
minTime: { $min: "$times" }
} },
{ $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
{ $project: {
_id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
avgTime: { $avg: ["$maxTime", "$minTime"] }
} },
{ $match: { avgTime: { $gt: 7 } } }
75 Giai đoạn ____175 có thể sử dụng chỉ số không gian địa lý.
{ $match: { name: "Joe Schmoe" } },
{ $addFields: {
maxTime: { $max: "$times" },
minTime: { $min: "$times" }
} },
{ $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
{ $project: {
_id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
avgTime: { $avg: ["$maxTime", "$minTime"] }
} },
{ $match: { avgTime: { $gt: 7 } } }
75 phải là giai đoạn đầu tiên trong một đường ống tổng hợp.

Bắt đầu từ MongoDB 4.2, trong một số trường hợp, một đường ống tổng hợp có thể sử dụng gói chỉ mục

{ $match: { name: "Joe Schmoe" } },
{ $addFields: {
maxTime: { $max: "$times" },
minTime: { $min: "$times" }
} },
{ $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
{ $project: {
_id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
avgTime: { $avg: ["$maxTime", "$minTime"] }
} },
{ $match: { avgTime: { $gt: 7 } } }
78 trả về một tài liệu trên mỗi giá trị khóa chỉ số.

Ghi chú

{ $match: { name: "Joe Schmoe" } },
{ $addFields: {
maxTime: { $max: "$times" },
minTime: { $min: "$times" }
} },
{ $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
{ $project: {
_id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
avgTime: { $avg: ["$maxTime", "$minTime"] }
} },
{ $match: { avgTime: { $gt: 7 } } }
78 thực hiện nhanh hơn
{ $match: { name: "Joe Schmoe" } },
{ $addFields: {
maxTime: { $max: "$times" },
minTime: { $min: "$times" }
} },
{ $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
{ $project: {
_id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
avgTime: { $avg: ["$maxTime", "$minTime"] }
} },
{ $match: { avgTime: { $gt: 7 } } }
80 nếu có nhiều tài liệu trên mỗi giá trị chỉ số tồn tại. Tuy nhiên, các tham số quét chỉ số có thể ảnh hưởng đến thời gian so sánh thời gian của
{ $match: { name: "Joe Schmoe" } },
{ $addFields: {
maxTime: { $max: "$times" },
minTime: { $min: "$times" }
} },
{ $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
{ $project: {
_id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
avgTime: { $avg: ["$maxTime", "$minTime"] }
} },
{ $match: { avgTime: { $gt: 7 } } }
78 và
{ $match: { name: "Joe Schmoe" } },
{ $addFields: {
maxTime: { $max: "$times" },
minTime: { $min: "$times" }
} },
{ $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
{ $project: {
_id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
avgTime: { $avg: ["$maxTime", "$minTime"] }
} },
{ $match: { avgTime: { $gt: 7 } } }
80.

Các chỉ mục có thể bao gồm các truy vấn trong một đường ống tổng hợp. Một truy vấn được bảo hiểm sử dụng một chỉ mục để trả về tất cả các tài liệu và có hiệu suất cao.

Nếu hoạt động tổng hợp của bạn chỉ yêu cầu một tập hợp con của các tài liệu trong bộ sưu tập, hãy lọc các tài liệu trước:

  • Sử dụng các giai đoạn

    { $sort: { age : -1 } },
    { $match: { status: 'A' } }
    4,
    { $sort: { age : -1 } },
    { $skip: 5 },
    { $project: { status: 1, name: 1 } }
    1 và
    { $sort: { age : -1 } },
    { $project: { status: 1, name: 1 } },
    { $skip: 5 }
    7 để hạn chế các tài liệu đi vào đường ống.

  • Khi có thể, hãy đặt

    { $sort: { age : -1 } },
    { $match: { status: 'A' } }
    4 ở đầu đường ống để sử dụng các chỉ mục quét các tài liệu phù hợp trong một bộ sưu tập.

  • { $sort: { age : -1 } },
    { $match: { status: 'A' } }
    4, sau đó là
    { $match: { year: 2014 } },
    { $redact: { $cond: { if: { $eq: [ "$level", 5 ] }, then: "$$PRUNE", else: "$$DESCEND" } } },
    { $match: { year: 2014, category: { $ne: "Z" } } }
    4 khi bắt đầu đường ống tương đương với một truy vấn duy nhất với một loại và có thể sử dụng một chỉ mục.

Một đường ống chứa một chuỗi

{ $match: { year: 2014 } },
{ $redact: { $cond: { if: { $eq: [ "$level", 5 ] }, then: "$$PRUNE", else: "$$DESCEND" } } },
{ $match: { year: 2014, category: { $ne: "Z" } } }
4 theo sau là
{ $sort: { age : -1 } },
{ $project: { status: 1, name: 1 } },
{ $skip: 5 }
7 sau đó là
{ $sort: { age : -1 } },
{ $skip: 5 },
{ $project: { status: 1, name: 1 } }
1

{ $match: { name: "Joe Schmoe" } },
{ $addFields: {
maxTime: { $max: "$times" },
minTime: { $min: "$times" }
} },
{ $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
{ $project: {
_id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
avgTime: { $avg: ["$maxTime", "$minTime"] }
} },
{ $match: { avgTime: { $gt: 7 } } }
6

Trình tối ưu hóa thực hiện sự kết hợp

{ $match: { year: 2014 } },
{ $redact: { $cond: { if: { $eq: [ "$level", 5 ] }, then: "$$PRUNE", else: "$$DESCEND" } } },
{ $match: { year: 2014, category: { $ne: "Z" } } }
4 +
{ $sort: { age : -1 } },
{ $skip: 5 },
{ $project: { status: 1, name: 1 } }
1 để biến đổi trình tự thành phần sau:
{ $match: { year: 2014 } },
{ $redact: { $cond: { if: { $eq: [ "$level", 5 ] }, then: "$$PRUNE", else: "$$DESCEND" } } },
{ $match: { year: 2014, category: { $ne: "Z" } } }
4 +
{ $sort: { age : -1 } },
{ $skip: 5 },
{ $project: { status: 1, name: 1 } }
1 Coalescence
to transforms the sequence to the following:

{ $match: { name: "Joe Schmoe" } },
{ $addFields: {
maxTime: { $max: "$times" },
minTime: { $min: "$times" }
} },
{ $match: { maxTime: { $lt: 20 }, minTime: { $gt: 5 } } },
{ $project: {
_id: 1, name: 1, times: 1, maxTime: 1, minTime: 1,
avgTime: { $avg: ["$maxTime", "$minTime"] }
} },
{ $match: { avgTime: { $gt: 7 } } }
7

MongoDB tăng số lượng

{ $sort: { age : -1 } },
{ $skip: 5 },
{ $project: { status: 1, name: 1 } }
1 với việc sắp xếp lại.

Mẹo

Xem thêm: