Vấn đề là khi bạn thực hiện lookup
sử dụng pipeline
với giai đoạn so khớp, thì chỉ mục sẽ chỉ được sử dụng cho các trường được so khớp với $eq operator
và chỉ mục còn lại sẽ không được sử dụng.
Và ví dụ bạn đã chỉ định với đường ống sẽ hoạt động như thế này ( một lần nữa chỉ mục sẽ không được sử dụng ở đây vì nó không phải là $eq
)
db.matches.aggregate([
{
$lookup: {
from: "players",
let: {
ids: {
$map: {
input: "$players",
in: "$$this._id"
}
}
},
pipeline: [
{
$match: {
$expr: {
$in: [
"$_id",
"$$ids"
]
}
}
}
],
as: "players"
}
}
])
Vì người chơi là một mảng đối tượng nên trước tiên nó cần được ánh xạ tới mảng id