MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB:Pipeline-Suche mit langsamer Leistung im Vergleich zur einfachen Suche

Die Sache ist die, wenn Sie eine lookup durchführen mit pipeline mit einer Übereinstimmungsstufe, dann würde der Index nur für die Felder verwendet, die mit dem $eq operator abgeglichen werden und für den Rest wird der Index nicht verwendet.

Und das Beispiel, das Sie mit der Pipeline angegeben haben, funktioniert so (wieder wird der Index hier nicht verwendet, da er nicht verwendet wird $eq )

db.matches.aggregate([
  {
    $lookup: {
      from: "players",
      let: {
        ids: {
          $map: {
            input: "$players",
            in: "$$this._id"
          }
        }
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $in: [
                "$_id",
                "$$ids"
              ]
            }
          }
        }
      ],
      as: "players"
    }
  }
])

Da Spieler ein Array von Objekten sind, muss es zuerst einem Array von IDs zugeordnet werden

MongoDB Playground