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

IT技术 javascript firebase google-cloud-firestore
2021-02-03 14:59:36
var jobskill_ref = db.collection('job_skills').where('job_id','==',post.job_id);
jobskill_ref.delete();

抛出错误

jobskill_ref.delete 不是函数

6个回答

您只能在拥有文档后删除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();
  });
});
感谢您发布改进的答案。我的回答侧重于这样一个事实,即您需要先执行查询,然后才能删除其结果(单独)。很高兴看到您找到了一种方法来改进我的上下文方法,感谢您的分享。
2021-03-22 14:59:36
@OliverDixon 据我所知,弗兰克提出了删除一系列回答 OP 问题的文档的关键要求(例如“删除位置”)......工程师可以调整其他任何内容以满足他们的需求。您添加了一个答案,这可能会帮助其他人解决您在 Firebase 函数中的特定用途,真是太棒了……因为用户没有专门调用 Firebase 函数,这可能会使您的响应变得不那么平易近人 - 特别是因为它使用了一些独特的 ES2017/TS特征。哦,仅供参考,弗兰克是一位受人尊敬的 Firebase 工程师。😃
2021-03-22 14:59:36
也只是一个说明,返回该函数,以便在出现错误时将其标记在您的日志中。
2021-03-22 14:59:36
谢谢指点。不确定这里的选项是什么……也许这是 NodeJS?.. 在我的情况下,使用 web JS 并且不得不使用get()进行调用然后是.then()像这样:.get().then(function (querySnapshot) {}
2021-03-25 14:59:36
我不能说我没有尝试!🤷‍♂️😃 您可能会在分析中考虑此答案与您的相比的投票数。需要明确的是,我并没有说您的代码适用于 Firebase 函数,但是您在此处的评论和回答中特别指出了这一点。将其与 Frank 的答案进行比较,后者提出了“删除位置”的关键要求,并举例说明了用户可以适应他们的需求。懒惰的复制粘贴是一个问题......但弗兰克的回答解释了为什么用户需要做某事......你的回答只是提供了一种不同的代码方法,没有解释。😕
2021-04-08 14:59:36

为此使用批量写入例如:

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();
如果没有运行循环,我们如何执行此解决方案?请建议。谢谢。
2021-04-01 14:59:36
请注意A batched write can contain up to 500 operations,因此可能需要额外的逻辑,具体取决于文档的数量
2021-04-13 14:59:36
//The following code will find and delete the document from firestore

const doc = await this.noteRef.where('userId', '==', userId).get();
doc.forEach(element => {
    element.ref.delete();
    console.log(`deleted: ${element.id}`);
});
@astroboy 我们如何使用批处理删除,请分享。谢谢。
2021-03-27 14:59:36
不确定你将不得不尝试。
2021-04-01 14:59:36
您可以使用批处理进行删除吗?因为逐个删除文档不是最佳选择。
2021-04-06 14:59:36

该固定我的问题,坦率的回答的关键部分是.refdoc.ref.delete()

我最初只有doc.delete()which 给出了“不是函数”错误。现在我的代码看起来像这样并且完美运行:

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);
});
但这不会捕获错误吗?它不会等待 Foreach 迭代器完成。
2021-03-27 14:59:36
这里的关键是你使用 .ref.delete()
2021-04-08 14:59:36

当然,您可以使用 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()它们并循环它们,然后delete()它们,而你可以像任何 SQL 语句一样准备一个查询,在一个步骤中删除哪里,但谷歌决定这样做。所以,就目前而言,这是唯一的选择。

如果没有运行循环,我们如何执行此解决方案?请建议。谢谢。
2021-03-18 14:59:36