Tengo dos documentos -
const taskSchema = new mongoose.Schema({ leadId: { type: String, default: '' }, customer_name: { type: String, default: '' } }) const leadSchema = new mongoose.Schema({ Id: { type: String, default: "" }, associate_status: { type: Boolean, default: false }, })Quiero ejecutar una consulta sobre tareas para obtener todos los clientes potenciales en los que el estado de asociado sea verdadero.
LeadId en el esquema de tareas es el mismo que Id en el esquema principal.
Intenté esto -
const report = await taskModel.aggregate([ { $lookup: { from: 'leads', let: { leadId: '$leadId' }, pipeline: [ { $match: { $expr: { $eq: ['$Id', '$$leadId'], }, }, }, ], as: 'leaditems', }, } { $unwind: '$leaditems' }, { $match: { leaditems.associate_status: true}} ])Pero como tengo una gran cantidad de documentos (más de 200 000 clientes potenciales y 100 000 tareas, y estos números seguirán creciendo), la consulta a veces se ejecuta después de 9 a 10 segundos y, a veces, no se ejecuta en absoluto. Estoy buscando un enfoque más optimizado o cualquier otra implementación que haga que esto funcione.
Actualizar:
Intenté esto también pero no mejoré.
const report = await taskModel.aggregate([ { $lookup: { from: 'leads', let: { leadId: '$leadId' }, pipeline: [ { $match: { $expr: { $and: [ { $eq: ['$Id', '$$leadId'], }, { $eq: ['$associate_status', true], }, ], }, }, }, ], as: 'leaditems', }, } ])Para usar el índice en $exp dentro de una canalización de búsqueda, necesita MongoDB 5. MongoDB 4.4.9 no usará el índice y la consulta será lenta.
$lookup igualdad simple$unwind y prefiere sus datos en una matriz, puede usar $filter const report = await taskModel.aggregate([ { $lookup: { from: 'leads', localField: "leadId", foreignField: "Id", as : "leaditems" }, { $unwind: '$leaditems' }, { $match: { leaditems.associate_status: true}} ])Si es posible, haga una evaluación comparativa después de hacer eso y envíe algunos comentarios.
Ponga $match en pipeline de $lookup o incluso intente ponerlo antes $lookup .
Establecer index en ambos ID asociados.
Tal vez su servicio tenga una restricción de conexión a la base de datos de 10 segundos, intente hacerlo más largo.