Il fatto è che quando esegui una lookup
utilizzando pipeline
con una fase di corrispondenza, l'indice verrebbe utilizzato solo per i campi che corrispondono a $eq operator
e per il resto l'indice non verrà utilizzato.
E l'esempio che hai specificato con pipeline funzionerà in questo modo ( di nuovo l'indice non verrà utilizzato qui perché non lo è $eq
)
db.matches.aggregate([
{
$lookup: {
from: "players",
let: {
ids: {
$map: {
input: "$players",
in: "$$this._id"
}
}
},
pipeline: [
{
$match: {
$expr: {
$in: [
"$_id",
"$$ids"
]
}
}
}
],
as: "players"
}
}
])
Poiché i giocatori sono una matrice di oggetti, è necessario prima mapparli su una matrice di ID