web-dev-qa-db-fra.com

Comment supprimer un document d'un magasin à l'aide de la clause where

var jobskill_ref = db.collection('job_skills').where('job_id','==',post.job_id);
jobskill_ref.delete();

Erreur renvoyée

jobskill_ref.delete n'est pas une fonction

11
Amit Sinha

Vous ne pouvez supprimer un document que lorsque vous avez une DocumentReference. Pour obtenir cela, vous devez d'abord exécuter la requête, puis parcourir la QuerySnapshot et enfin supprimer chaque DocumentSnapshot en fonction de sa ref.

var jobskill_query = db.collection('job_skills').where('job_id','==',post.job_id);
jobskill_query.get().then(function(querySnapshot) {
  querySnapshot.forEach(function(doc) {
    doc.ref.delete();
  });
});
19

J'utilise batched write for this. Par exemple:

var jobskill_ref = db.collection('job_skills').where('job_id','==',post.job_id);
let batch = firestore.batch();

jobskill_ref
  .get()
  .then(snapshot => {
    snapshot.docs.forEach(doc => {
      batch.delete(doc.ref);
    });
    return batch.commit();
  })

ES6 async/attend:

const jobskills = await store
  .collection('job_skills')
  .where('job_id', '==', post.job_id)
  .get();

const batch = store.batch();

jobskills.forEach(doc => {
  batch.delete(doc.ref);
});

await batch.commit();
4
jamstooks

la partie clé de la réponse de Frank qui a résolu mes problèmes était le .ref dans doc.ref.delete()

Je n'avais à l'origine que doc.delete() qui a donné une erreur "not a function". maintenant mon code ressemble à ceci et fonctionne parfaitement:

let fs = firebase.firestore();
let collectionRef = fs.collection(<your collection here>);

collectionRef.where("name", "==", name)
.get()
.then(querySnapshot => {
  querySnapshot.forEach((doc) => {
    doc.ref.delete().then(() => {
      console.log("Document successfully deleted!");
    }).catch(function(error) {
      console.error("Error removing document: ", error);
    });
  });
})
.catch(function(error) {
  console.log("Error getting documents: ", error);
});
1
Jacob Hixon

Et bien sûr, vous pouvez utiliser wait/async:

exports.delete = functions.https.onRequest(async (req, res) => {
try {
    var jobskill_ref = db.collection('job_skills').where('job_id','==',post.job_id).get();
    jobskill_ref.forEach((doc) => {
      doc.ref.delete();
    });
  } catch (error) {
    return res.json({
      status: 'error', msg: 'Error while deleting', data: error,
    });
  }
});

Je ne sais pas pourquoi vous devez obtenir () eux et boucle sur eux, puis delete () eux, alors que vous pouvez préparer une requête avec où supprimer en une étape Déclaration SQL, mais Google a décidé de le faire comme ça. donc, pour l'instant, c'est la seule option.

0
HMagdy