Aquí está el escenario:
Actualmente, lo mejor que se me ocurrió es usar una agregación. Las etapas se ven así:
Agregación -> coincidencia en 2 valores indexados en la primera colección -> ordenación -> búsqueda con una tubería que tiene una coincidencia en la propiedad de relación en ambas colecciones Y coincidencia basada en el valor de búsqueda potencial en un valor indexado en la segunda colección -> haga coincidir con OR que mira 2 campos de búsqueda en la primera colección usando expresiones regulares o si el proyecto de la búsqueda contenía algún resultado -> límite -> proyecto con valores
Las preocupaciones son que la búsqueda hará una combinación de todos los documentos de la primera colección con la segunda colección durante la búsqueda. Tenga en cuenta que todo lo que se busca es un índice, pero la búsqueda es la principal preocupación aquí. ¿Sugerencias para hacer esto de la manera correcta? ¿Mejor manera?
Ejemplo de código:
db.collection1.aggregate( [ { $match: { // initial filters based on indexed values field1: "somevalue", field2: "somevalue" }, }, { $sort: { firstSortField: -1, _id: -1 // sort results by needed order } }, { $lookup: // join with another collection to search on a specific value { from: collection2, localField: someLocalField, foreignField: someForeignField, as: "someJoinedFields" } }, { $addFields: { extraField: ["$someJoinedFields.someExtaField"] // add potential array of values } }, { $match: ( { $or: [ { field3: {$regex: ""}}, // potential search field { field4: {$regex: ""}}, // potential search field { extraField: {$regex: ""}} // potential search field ] } ) }, { $limit: 100 // limit to 100 results for pagination }, { $project: { // final results finalField: 1, finalField2: 1, finalField3: 1 } } ])Lamentablemente, sus esquemas no se ajustan de manera eficiente a sus necesidades por las siguientes razones:
_id , lo cual es bueno ya que está garantizado que es único.$skip en su ejemplo)$limit (como dijiste: D)$limit (como lo hace actualmente: D) Básicamente, está preguntando algo que le permite hacer $skip before $lookup , $match before $skip y $lookup before $skip . ¡Esto no es posible!
Todas las soluciones que vienen a la mente son en realidad difíciles de implementar.
Una de las mejores cosas de MongoDB es lo fácil que es cambiar la estructura de los documentos. Si puede hacerlo, sin destruir alguna otra característica, hágalo. Al incrustar el documento, ya no necesita la $lookup , lo que elimina el problema por completo (incluso puede hacer que el límite sea mucho más grande, ya que lo único "lento" será la fase de recopilación)
https://docs.mongodb.com/manual/core/materialized-views/
Esto le permitirá no cambiar la estructura original mientras tiene la velocidad de la consulta incrustada. Este método ralentizará su velocidad de escritura, ya que tendrá que recrear la vista en cada inserción o editar en una de las colecciones, pero la lectura será más rápida.
$lookup mejoradaCon este método, fusionará muchos menos documentos y podrá descartarlos fácilmente.
El camino a seguir es cambiar la estructura de la base de datos. Entiendo aunque, que puede ser imposible de hacer por varias razones.
No tiene muchas operaciones de escritura y no tiene problemas de espacio (ya que esto ocupará el doble de espacio)
Utilice la búsqueda si no puede cambiar la estructura y no puede permitir escrituras más lentas. Este es, con mucho, el más lento de los 3 métodos, pero aún así te dará un impulso. A largo plazo, este método podría no ser una solución en absoluto, todo depende de cuáles sean sus casos de uso: D