Как добавить проверку в firebase firestore, чтобы предотвратить добавление дублирующегося идентификатора документа

#javascript #reactjs #firebase #google-cloud-firestore #react-hooks

# #javascript #reactjs #firebase #google-облако-firestore #реагирующие крючки

Вопрос:

Я вручную вставляю идентификатор документа в firestore, т.е. Документ автомобилей

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

В этом коде, если я случайно добавлю тот же номер chasis снова, он переопределяет существующие значения, которые хранятся в соответствии с существующим номером chasis

 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;
 

я хочу избежать передачи одного и того же документа, и в результате на экране должно появиться сообщение в виде предупреждения

Ответ №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;
    }
  }
}
 

Подробнее об этом см. Документацию Firebase по написанию правил безопасности.

Ответ №2:

Если вы хотите предотвратить дублирование номера шасси, выполните следующие действия:-

  1. Проверьте свою базу данных (Firestore) с помощью ключа номера шасси.

    Пожалуйста, проверьте код для удобства.

импортируйте firebase из ‘./../ firebase’; // вы можете назвать firebase как DB, как вы сделали eailer.

firebase.firestore().collection(‘cars’).where(‘chasisNumber’,’==’,’yourChasisNumber’).onSnapshot((snapshot ) => {пусть cars = snapshot.docs.map((doc) => ({ id: doc.id , …doc.data() })); return cars;});

  1. Если он возвращает некоторые данные, разорвите элемент управления в функции с помощью ключевого слова return .
  2. В противном случае отправьте свои данные.

Это самое простое решение, которое вы можете попробовать.