programing

where 절을 사용하여 firestore에서 문서를 삭제하는 방법

padding 2023. 6. 17. 08:46
반응형

where 절을 사용하여 firestore에서 문서를 삭제하는 방법

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

내 문제를 해결한 프랭크의 대답의 핵심 부분은.refdoc.ref.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);
});

아니면 이것을 시도해 보세요, 하지만 당신은 사전에 ID를 가지고 있어야 합니다.

export const deleteDocument = (id) => {
return (dispatch) => {
    firebase.firestore()
    .collection("contracts")
    .doc(id)
    .delete()
}

}

이제 다음 작업을 수행할 수 있습니다.

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

이 문제를 해결하는 방법은 각 문서에 고유한 정보를 제공하는 것입니다.ID, 해당 필드에서 쿼리, 문서 가져오기반환된 문서의 ID이며 삭제에 사용됩니다.이와 같은 경우:

(신속)

func rejectFriendRequest(request: Request) {
    DispatchQueue.global().async {
        self.db.collection("requests")
            .whereField("uniqueID", isEqualTo: request.uniqueID)
            .getDocuments { querySnapshot, error in
                if let e = error {
                    print("There was an error fetching that document: \(e)")
                } else {
                    self.db.collection("requests")
                        .document(querySnapshot!.documents.first!.documentID)
                        .delete() { err in
                            if let e = err {
                                print("There was an error deleting that document: \(e)")
                            } else {
                                print("Document successfully deleted!")
                            }
                        }
                }
            }
    }
}

코드를 조금 정리할 수는 있지만, 이것이 제가 생각해 낸 해결책입니다.그것이 미래에 누군가를 도울 수 있기를 바랍니다!

물론 wait/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 문처럼 한 번에 삭제할 위치가 포함된 하나의 쿼리를 준비할 수 있는데 왜 () 그것들을 가져와서 루프한 다음 삭제()해야 하는지 모르겠습니다. 하지만 구글은 그렇게 하기로 결정했기 때문에, 현재로서는 이것이 유일한 옵션입니다.

클라이언트 측에서 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();
};

이것이 클라이언트 측에서 파이어스토어를 사용하는 모든 사람에게 도움이 되기를 바랍니다.

const firestoreCollection = db.collection('job_skills')

var docIds = (await firestoreCollection.where("folderId", "==", folderId).get()).docs.map((doc => doc.id))

// for single result
await firestoreCollection.doc(docIds[0]).delete()

// for multiple result

await Promise.all(
  docIds.map(
    async(docId) => await firestoreCollection.doc(docId).delete()
  )
)

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');
}

언급URL : https://stackoverflow.com/questions/47180076/how-to-delete-document-from-firestore-using-where-clause

반응형