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

时间:2017-11-08 12:43:31

标签: javascript firebase google-cloud-firestore

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

引发错误

  

jobskill_ref.delete不是函数

9 个答案:

答案 0 :(得分:24)

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

答案 1 :(得分:6)

为此,我使用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 :(得分:3)

//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}`);
});

答案 3 :(得分:1)

弗兰克回答问题的关键部分是我.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);
});

答案 4 :(得分: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,
    });
  }
});

我不知道为什么您必须获取()并在它们上循环,然后删除(),而您可以像任何SQL语句一样,准备在一个步骤中将其删除的查询,但是Google决定这样做。因此,目前,这是唯一的选择。

答案 5 :(得分:0)

delete(seccion: string, subseccion: string) 
{
 const deletlist = this.db.collection('seccionesclass', ref => ref.where('seccion', '==', seccion).where('subseccion', '==' , subseccion))
deletlist.get().subscribe(delitems => delitems.forEach( doc=> doc.ref.delete()));
    alert('record erased');
}

答案 6 :(得分:0)

如果在客户端使用Cloud Firestore,则可以使用唯一密钥生成器程序包/模块(例如uuid)来生成ID。然后,将文档的ID设置为从uuid生成的ID,并将对该ID的引用存储在要存储在Firestore中的对象上。

例如: 如果要将个人对象保存到Firestore,首先,请使用uuid为该人生成ID,然后再进行如下保存。

const uuid = require('uuid') 

const person = { name: "Adebola Adeniran", age: 19}
const id = uuid() //generates a unique random ID of type string
const personObjWithId = {person, id} 

export const sendToFireStore = async (person) => {
  await db.collection("people").doc(id).set(personObjWithId);
};

// To delete, get the ID you've stored with the object and call // the following firestore query

export const deleteFromFireStore = async (id) => {
  await db.collection("people").doc(id).delete();
};

希望这可以帮助在客户端使用Firestore的任何人。

答案 7 :(得分:0)

您现在可以执行以下操作:

db.collection("cities").doc("DC").delete().then(function() {
    console.log("Document successfully deleted!");
}).catch(function(error) {
    console.error("Error removing document: ", error);
});

答案 8 :(得分:-2)

与标记的答案不同,这将捕获错误并且不会标记功能日志,您也可以将其作为相同的代码应用于云功能。您可以根据需要解开此代码。请记住,不要偷懒,做正确的事,否则您已经在编写遗留代码。

const users = await admin.firestore()
.collection('users')
.where('age', '===', someNumber).get()

const deleteUser = async (userUid: string) => {
    await admin.firestore().collection('users').doc(userUid).delete()
}

const usersToDeleteActions: Array<Promise<Result>> = []
users.docs.foreach((doc) => {
    usersToDeleteActions.push(deleteUser(doc.id))
})

await Promise.all(usersToDeleteActions)