Es solo un script que envía un correo electrónico a firestore db, no sé cómo verificar si hay correos electrónicos repetidos en db. Código:
const Newsletter = () => { const [input, setInput] = useState(""); const inputHandler = (e) => { setInput(e.target.value) } const submitHandler = (e) => { e.preventDefault(); if(input) { console.log(input); addDoc(collection(db, 'emails'),{ email: input, time: Timestamp.now(), }) } }Entiendo que desea evitar que dos documentos de Firestore de la colección de emails contengan el mismo valor para su campo de email . Un enfoque posible es utilizar una Transaction .
Como está utilizando React y JS SDK, no puede utilizar una consulta en su transacción. Por lo tanto, debe mantener otra colección en la que almacene un documento para cada dirección de correo electrónico existente, con la dirección de correo electrónico como ID del documento .
De esta manera, puede usar un código como el siguiente (no probado):
import { runTransaction, ... } from "firebase/firestore"; try { const emailToBeSaved = ....; // The new email await runTransaction(db, async (transaction) => { const emailDocRef = doc(db, 'existingEmails', emailToBeSaved); const emailDoc = await transaction.get(emailDocRef); if (emailDoc.exists()) { throw 'This email is already present in the DB'; } transaction .set(doc(db, 'existingEmails', emailToBeSaved), { email: emailToBeSaved }) // The value of this last parameter is not important, it could be {foo: "bar"} .set(doc(collection(db, 'emails')), { email: emailToBeSaved, time: Timestamp.now(), }) }); console.log("Transaction successfully committed!"); } catch (e) { console.log("Transaction failed: ", e); } Entonces, verificamos, en la Transacción, si existe un documento con ID = emailToBeSaved en la colección de correos electrónicos existingEmails .
existingEmails (con datos ficticios, solo nos interesa la ID del documento, no su contenido) y agregamos el documento en la colección de emails . Estas dos escrituras se realizan en la Transacción. Tenga en cuenta que puede simplificar el enfoque utilizando los valores de correo electrónico como ID de los documentos en la colección de emails . De esta manera, no es necesario tener una colección adicional de correos electrónicos existingEmails .