aquí está la premisa básica de lo que estoy tratando de lograr aquí. si un usuario hace una pregunta sobre un producto, quiero enviar una notificación a otros usuarios que actualmente poseen ese producto. básicamente diciendo "oye, tal y tal tiene una pregunta sobre este producto. Tal vez puedas ayudar ya que ya lo tienes".
cada colección de perfil de usuario tiene una subcolección llamada 'notificar' donde las notificaciones se almacenan para varias cosas. lo que debo hacer es ordenar los productos de usuario y encontrar a cada usuario que posee el producto y luego crear una publicación de notificación solo en las subcolecciones de notificación para aquellos usuarios específicos que poseen ese producto.
aquí está el código básico. el primer bit funciona porque devuelve una matriz de ID de usuario que poseen ese producto. donde estoy luchando ahora es lograr que cree un nuevo documento en la subcolección Notificar solo para esos usuarios específicos. ¿Es posible hacer esto?
exports.Questions = functions.firestore .document("/userPost/{id}") .onCreate(async (snap, context) => { const data = snap.data(); if (data.question == true) { const userProducts = await db .collection("userProducts") .where("product", "==", data.tag) .get(); const userData = userProducts.docs.map((doc) => doc.data().userId); await db .collection("userProfile") .where("userId", "in", userData) .get() .then((querySnapshot) => { return querySnapshot.docs.ref.collection("notify").add({ message: "a user has asked about a product you own", }); }); });Su solución actual está en el camino correcto, pero se pueden realizar mejoras.
data.question == true .userProfile/<uid> ya que no está utilizando su contenido.ref.add(data) es una abreviatura de ref.doc().set(data) que puede usar en la escritura por lotes para crear nuevos documentos. exports.Questions = functions.firestore .document("/userPost/{id}") .onCreate(async (snap, context) => { const data = snap.data(); if (!data.question) { console.log("New post not a question. Ignored.") return; } const userProducts = await db .collection("userProducts") .where("product", "==", data.tag) .get(); const userIds = userProducts.docs.map(doc => doc.get("userId")); // more efficient than doc.data().userId // WARNING: Limited to 500 writes at once. // If handling more than 500 entries, split into groups. const batch = db.batch(); const notificationContent = { message: "a user has asked about a product you own", }; userIds.forEach(uid => { // creates a ref to a new document under "userProfile/<uid>/notify" const notifyDocRef = db.collection(`userProfile/${uid}/notify`).doc(); batch.set(notifyDocRef, notificationContent); }); await batch.commit(); // write changes to Firestore });Nota: Aquí no hay un manejo especial para cuando nadie ha comprado un producto antes. Considere también hacer ping al propietario del producto.