如何使用where子句从Firestore中删除文档

问题描述 投票:20回答:5
var jobskill_ref = db.collection('job_skills').where('job_id','==',post.job_id);
jobskill_ref.delete();

抛出错误

jobskill_ref.delete不是函数

javascript firebase google-cloud-firestore
5个回答
33
投票

只有在拥有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();
  });
});

7
投票

我为此使用batched writes。例如:

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

2
投票

Frank回答中解决我的问题的关键部分是.ref中的doc.ref.delete()

[我最初只有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);
});

0
投票

当然,您可以使用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语句一样,但是Google决定那样做。因此,目前,这是唯一的选择。


0
投票

我面临类似的问题,但是在dart中,有人可以将给定的代码转换为dart代码吗?>>

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();
    });
});
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.