Sé que se han hecho preguntas similares a esta 1000 veces, pero por mi vida estoy luchando con algo que siento que es bastante simple.
Tenemos 2 tablas, una llamada order_lines y la otra order_lines_meta, primero necesito consultar order_lines y para cada línea obtener order_lines_meta y devolver eso
He probado muchas variaciones, aquí es donde estoy y estoy atascado, necesito que espere a que order_lines_meta regrese porque, de lo contrario, obtendré metadatos en blanco ya que los datos vienen después de que nodejs ya haya generado order_lines
Al final, un objeto que contiene información de pedidos, elementos de línea de objetos y, dentro de los elementos de línea, un objeto de metadatos.
Agradezco la ayuda, parece que no puedo envolver mi cerebro en esto, y ciertamente estoy abierto a otras formas de hacer esto también
Usando nodejs, express, mecanografiado, firestore
const orderNumber = req.query.orderNumber as string; const customerName = req.query.customerName as string; const orderDate = req.query.orderDate as string; const pickListObj = { orderNumber: orderNumber, customerName: customerName, orderDate: orderDate, line_items: <any>[], }; db.collection('order_lines').where('number', '==', orderNumber).get().then((snap) => { const promises = <any>[]; snap.forEach(async (order: any) => { // get meta data const metaDataObj = <any>[]; const productName = order.data().name; const productQty = order.data().quantity; promises.push(db.collection('worder_line_meta').where('lineId', '==', order.data().lineId).get().then((doc: any) => { if (doc.display_value != '') { const meta = [{display_key: doc.data().display_key, display_value: doc.data().display_value}]; metaDataObj.push(meta); } })); }); return Promise.all(promises); }).then(() => { pickListObj.line_items.push({name: productName, quantity: productQty, meta_data: metaDataObj}); });Mueva la instrucción push del último .then dentro del .then anterior:
promises.push(db.collection('worder_line_meta')...then((doc: any) => { if (doc.display_value != '') { ... } pickListObj.line_items.push({name: productName, quantity: productQty, meta_data: metaDataObj}); })); En el último .then , encontrará el pickListObj completo.
Sin embargo, me pregunto si podría ser más simple y rápido unir las dos colecciones de bases de datos directamente en la base de datos y recuperar todo con una operación db.collection .