Как удалить документ из firestore, используя предложение where

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

Ошибка брошена

jobskill_ref.delete не является функцией

Ответ 1

Вы можете удалить документ только после того, как у вас есть 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();
  });
});

Ответ 2

Для этого я использую пакетные записи. Например:

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 async/await:

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

Ответ 3

ключевая часть ответа Фрэнка, которая исправила мои проблемы, была .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

И, конечно, вы можете использовать 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

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

В отличие от отмеченного ответа, он будет отлавливать ошибки и не помечать журналы функций, также вы можете применить это к облачным функциям как тот же код. Вы можете развернуть этот код с обещанием, если хотите. Помните, что не ленитесь, делайте все правильно, иначе вы уже пишете устаревший код.

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)