我有一个Firestore数据库。我的项目插件:
cloud_firestore:^ 0.7.4 firebase_storage:^ 1.0.1
这有一个包含多个文档的“邮件”集合。 我需要删除邮件集中的所有文档。但是此代码失败:
Firestore.instance.collection('messages').delete();
但删除未定义
正确的语法如何?
答案 0 :(得分:5)
啊。第一个答案是几乎是正确的。该问题与dart中的map方法及其与Futures的工作方式有关。无论如何,尝试像这样使用for循环,您应该会很好:
firestore.collection('messages').getDocuments().then((snapshot) {
for (DocumentSnapshot ds in snapshot.documents){
ds.reference.delete();
});
});
答案 1 :(得分:1)
如Firestore docs中所述,目前没有可自动删除集合的操作。
您需要获取所有文档,并遍历它们以删除每个文档。
firestore.collection('messages').getDocuments().then((snapshot) {
return snapshot.documents.map((doc) {
doc.reference.delete();
});
});
请注意,这只会删除messages
集合。如果此路径中有子集合,它们将保留在Firestore中。该文档还具有云功能,还与可调用功能集成在一起,该功能使用Firebase命令行界面来帮助处理嵌套删除。
答案 2 :(得分:1)
迭代 QueryDocumentSnapshot
,获取 DocumentReference
并对其调用 delete
。
var collection = FirebaseFirestore.instance.collection('collection');
var snapshots = await collection.get();
for (var doc in snapshots.docs) {
await doc.reference.delete();
}
答案 3 :(得分:0)
删除之所以不起作用,是因为该功能是删除文档而不是集合,因此不使用:
Firestore.instance.collection('messages').delete();
使用此:
Firestore.instance.collection('messages').document(documentID).delete();
答案 4 :(得分:0)
一个一个地删除Firestore集合中的所有文档:
db.collection("users").document(userID).collection("cart")
.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
for (QueryDocumentSnapshot document : task.getResult()) {
db.collection("users").document(userID).
collection("cart").document(document.getId()).delete();
}
} else {
}
}
});
答案 5 :(得分:0)
我认为这可能对任何参考文献中的多个馆藏都有帮助
// add ${documentReference} that contains / may contains the ${collectionsList}
_recursiveDeleteDocumentNestedCollections(
DocumentReference documentReference, List<String> collectionsList) async {
// check if collection list length > 0
if (collectionsList.length > 0) {
// this line provide an async forEach and wait until it finished
Future.forEach(collectionsList, (collectionName) async {
// get the collection reference inside the provided document
var nfCollectionRef = documentReference.collection(collectionName);
try {
// get nested collection documents
var nestedDocuemtnsQuery = await nfCollectionRef.getDocuments();
// loop through collection documents
Future.forEach(nestedDocuemtnsQuery.documents, (DocumentSnapshot doc) async {
// recursive this function till the last nested collections documents
_recursiveDeleteDocumentNestedCollections(
doc.reference, collectionsList);
// delete the main document
doc.reference.delete();
});
} catch (e) {
print('====================================');
print(e);
print('====================================');
}
});
}
}
答案 6 :(得分:0)
在最新版本的firebase中,您可以执行以下操作。
_collectionReference.snapshots().forEach((element) {
for (QueryDocumentSnapshot snapshot in element.docs) {
snapshot.reference.delete();
}
});
答案 7 :(得分:0)
以防万一,如果您不想使用流(因为它会一直删除,直到您取消订阅)。您可以继续删除。这是片段:
final collectionRef = FirebaseFirestore.instance.collection('collection_name');
final futureQuery = collectionRef.get();
await futureQuery.then((value) => value.docs.forEach((element) {
element.reference.delete();
}));
答案 8 :(得分:0)
Firestore.instance.collection("chatRoom").document(chatRoomId).collection("chats").getDocuments().then((value) {
for(var data in value.docs){
Firestore.instance.collection("chatRoom").document(chatRoomId).collection("chats")
.document(data.documentID).delete().then((value) {
Firestore.instance.collection("chatRoom").document(chatRoomId).delete();
});
}
});