Pozwala na bardziej intuicyjne budowanie kroków agregacji ("aggregation stages")Rozszerzenie interfejsu Query tak, aby ułatwić optymalizację zapytań. Lookupy dostają swoje ID, nie ma możliwości wybrania pola "as". Matche odnoszą się do lookupów po ich id.
Interfejs wygląda następująco:
```lang=js
const query = new Query("books");
const author_lookup_id = query.lookup({
from: "authors",
localField: "body.author",
foreignField: "sealious_id",
as: "author",
});
query.match({
lookups: { [author_lookup_id]: { "body.name": "Mickiewicz" } },
});
```
* [ ] Klasa wie, które `$match`e polegają na których `$lookupach` śledząc ich id.
* [ ] Każde id lookupa jest generowane na podstawie jego zawartości, z pominięciem pola `as`. Można odtworzyć wszystkie szczegóły lookupa na podstawie jego id.
* [ ] Klasa rozbija złożone `$match`-e na prostsze, aby stworzyć nowe okazje do optymalizacji zapytania:
```lang=js
query.match({
"body.year": 1834,
lookups: { [author_lookup_id]: { "body.name": "Mickiewicz" } },
});
```
staje się w wewnętrznej reprezentacji czymś tożsamym z:
```lang=js
[
{ $match: { "body.year": 1834 } },
{
$match: { lookups: { [author_lookup_id]: { "body.name": "Mickiewicz" } } },
},
];
```