web-dev-qa-db-ja.com

where句を使用してFirestoreからドキュメントを削除する方法

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

エラーがスローされました

jobskill_ref.deleteは関数ではありません

19
Amit Sinha

DocumentReferenceを取得したドキュメントのみを削除できます。それを得るには、最初にクエリを実行し、次にQuerySnapshotをループし、最後にDocumentSnapshotに基づいて各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();
  });
});
32

これには バッチ書き込み を使用します。例えば:

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非同期/待機:

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();
7
jamstooks

私の問題を修正したフランクの答えの重要な部分は、doc.ref.delete()の_.ref_でした。

元々doc.delete()しかなかったため、「関数ではない」エラーが発生しました。これで私のコードは次のようになり、完全に機能します。

_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);
});
_
2
Jacob Hixon

そしてもちろん、await/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,
    });
  }
});

なぜget()それらとloopが必要なのか分かりませんそれらについては、delete()、SQLステートメントのように1ステップで削除する場所を指定して1つのクエリを準備できますが、Googleはそのような。したがって、現時点では、これが唯一のオプションです。

0
HMagdy