Necesito el consejo de expertos para este código. Necesito saber ¿Hay alguna forma mejor de resolver esto?
Estoy usando la mangosta para db. Tengo un conjunto de datos como este:
A continuación se muestra la tabla de coincidencias:
{ _id: 617bc0113176d717f4ddd6ce, car: [], status: true }, { _id: 617bc0113176d717f4ddd6cg, car: [ { aid: '5c1b4ffd18e2d84b7d6febcg', } ], status: true }Y tengo una tabla Car en la que el nombre del coche está allí en nombre de una identificación como esta
{ _id: ObjectId('5c1b4ffd18e2d84b7d6febce'), name: 'ford' }, { _id: ObjectId('5c1b4ffd18e2d84b7d6febcg'), name: 'mitsubishi' },Entonces, quiero unir los datos de la tabla de automóviles, para que la respuesta obtenga el nombre en nombre de la ayuda. El resultado deseado será como
{ _id: 617bc0113176d717f4ddd6ce, car: [], status: true }, { _id: 617bc0113176d717f4ddd6cg, car: [ { aid: '5c1b4ffd18e2d84b7d6febcg', name: 'mitsubishi' } ], status: true }Para eso, tengo que fusionar la tabla de autos en matchTable. He hecho esto, pero quiero dar una sugerencia de que hay una mejor manera de hacerlo o está bien. Necesito el consejo de un experto.
const getData = await matchTable.find( { status: true } ).lean().exec(); let dataHolder = []; await Promise.all ( getData.map(async x => { await Promise.all( x.car.map(async y => { let data = await Car.findOne( { _id: ObjectId(y.aid) }, { name: 1 } ).lean().exec(); y.name = ''; if (data) { y.name = data.name; } }) ) // If I return { ...x }, then on response it will return {}, {} on car column dataHolder.push(x) //So I have chosen this approach }) );Por favor, guíeme si hay alguna solución mejor y más eficiente. Gracias por adelantado
Puede hacer uso de la agregación aquí.
const pipeline = [ { $match : { status : true } }, { $unwind: '$matchtable', }, { $lookup: { from: "cars", localField: "car.aid", foreignField: "_id", as: "matchcars" } }, { $addFields: { "car.carName": { $arrayElemAt: ["$matchcars.name", 0] } } }, { $group: { _id: "$_id", cars: { $push: "$matchcars" } } } ] const result = await matchTable.aggregate(pipeline).exec(); Asegúrese de que el campo de aid dentro de la matriz de automóviles (en la colección matchTable) sea un ObjectId porque se compara con _id (que es un ObjectId) dentro de la colección de cars .