Grazie a un thread github condiviso da Grégory NEUT nei commenti alla domanda ho potuto stabilire alcuni fatti:
- Il metodo populate() di Mongoose non utilizza la ricerca $ dietro le quinte di MongoDB. Fa semplicemente un'altra query al database.
- Mongoose non ha funzionalità che MongoDB non ha.
populate()effettua solo due o più query.
Secondo me, ci sono posti in cui usare populate() e altri per usare $lookup . Per query più complesse $lookup in una pipeline di aggregazione funzionerebbe meglio.