var jobskill_ref = db.collection('job_skills').where('job_id','==',post.job_id);
jobskill_ref.delete();
エラーがスローされました
jobskill_ref.deleteは関数ではありません
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();
});
});
これには バッチ書き込み を使用します。例えば:
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();
私の問題を修正したフランクの答えの重要な部分は、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);
});
_
そしてもちろん、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はそのような。したがって、現時点では、これが唯一のオプションです。