【问题标题】:How to add validation in firebase firestore to prevent adding duplicate doc id如何在 Firebase Firestore 中添加验证以防止添加重复的文档 ID
【发布时间】:2020-12-27 11:42:55
【问题描述】:

我在 Firestore 中手动插入文档 ID,即汽车文档

  //Example Doc
    cars:{
    chasisNumber :{
      chasisNumber:123dfs,
      carName: BMW 
     }
    }
  //Example Doc

在这段代码中,如果我不小心再次添加了相同的 chasis number,那么它会覆盖现有值,这些值存储在现有 chasis number

import db from "./firebase";

function ShowCars() {
const [chasis, setChasis] = useState("");
const [name, setName] = useState("");


const addCar =(e)=>{
e.preventDefault();
db.collection("cars").doc(chasis).set({
 chasisNumber:chasis, 
  carName:name
 });

}
  return (
    <div>
      <form>
        <input placeholder="chasis No" type="text" onChange={(e)=>{setChasis(e.target.value)} value={chasis}/>
        <input placeholder="Car Name" type="text" onChange={(e)=>{setName(e.target.value)} value={name}/>
        <button type="submit" onClick={addCar}>Add</button>
      </form>
    </div>
  )
}

export default ShowCars;

我想避免传递相同的文档,因此它应该在屏幕上显示一些消息作为警报

【问题讨论】:

    标签: javascript reactjs firebase google-cloud-firestore react-hooks


    【解决方案1】:

    如果要检查文档是否已经存在,可以这样做:

    let docRef = db.collection("cars").doc(chasis)
    docRef.get().then((doc) => {
      if (!doc.exists) {
        docRef.set({
          chasisNumber:chasis, 
          carName:name
        });
      }
    });
    

    如果要防止文档被覆盖,可以在数据库的服务器端安全规则中进行。例如,这允许创建但不更新数据:

    service cloud.firestore {
      match /databases/{database}/documents {
        match /cars/{car} {
          allow create: if true;
          allow update: if false;
    
          allow read: if true;
        }
      }
    }
    

    有关这方面的更多信息,请参阅 writing security rules 上的 Firebase 文档。

    【讨论】:

      【解决方案2】:

      如果您想防止重复机箱编号,请按照以下步骤操作:-

      1. 通过机箱编号键检查您的 Db (Firestore)。

        请检查代码是否方便。

      从'./../firebase'导入firebase; //你可以像 eailer 一样将 firebase 命名为 DB。

      firebase.firestore().collection('cars').where('chasisNumber','==','yourChasisNumber').onSnapshot((snapshot) => {让汽车 = snapshot.docs.map((doc) => ({ id: doc.id, ...doc.data() })); 还车;});

      1. 如果它返回一些数据,使用 return 关键字打破函数中的控制。
      2. 否则推送您的数据。

      这是您可以尝试的更简单的解决方案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-04
        • 1970-01-01
        • 2021-02-21
        • 2019-02-02
        • 2018-12-05
        • 2018-09-24
        • 1970-01-01
        • 2019-03-09
        相关资源
        最近更新 更多