Google cam kết thúc đẩy công bằng chủng tộc cho Cộng đồng người da đen. Xem cách thực hiện.
Trang này được dịch bởi Cloud Translation API.
Switch to English

Xóa dữ liệu khỏi Cloud Firestore

Các ví dụ sau minh họa cách xóa tài liệu, trường và bộ sưu tập.

Xóa tài liệu

Để xóa tài liệu, hãy sử dụng phương thức delete() :

Web
db.collection("cities").doc("DC").delete().then(function() {
    console.log("Document successfully deleted!");
}).catch(function(error) {
    console.error("Error removing document: ", error);
});
Nhanh
db.collection("cities").document("DC").delete() { err in
    if let err = err {
        print("Error removing document: \(err)")
    } else {
        print("Document successfully removed!")
    }
}
Objective-C
[[[self.db collectionWithPath:@"cities"] documentWithPath:@"DC"]
    deleteDocumentWithCompletion:^(NSError * _Nullable error) {
      if (error != nil) {
        NSLog(@"Error removing document: %@", error);
      } else {
        NSLog(@"Document successfully removed!");
      }
}];
  

Java

db.collection("cities").document("DC")
        .delete()
        .addOnSuccessListener(new OnSuccessListener<Void>() {
            @Override
            public void onSuccess(Void aVoid) {
                Log.d(TAG, "DocumentSnapshot successfully deleted!");
            }
        })
        .addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Log.w(TAG, "Error deleting document", e);
            }
        });

Kotlin + KTX

db.collection("cities").document("DC")
        .delete()
        .addOnSuccessListener { Log.d(TAG, "DocumentSnapshot successfully deleted!") }
        .addOnFailureListener { e -> Log.w(TAG, "Error deleting document", e) }
Java
// asynchronously delete a document
ApiFuture<WriteResult> writeResult = db.collection("cities").document("DC").delete();
// ...
System.out.println("Update time : " + writeResult.get().getUpdateTime());
Python
db.collection(u'cities').document(u'DC').delete()
C ++
db->Collection("cities").Document("DC").Delete().OnCompletion(
    [](const Future<void>& future) {
      if (future.error() == Error::kErrorOk) {
        std::cout << "DocumentSnapshot successfully deleted!\n";
      } else {
        std::cout << "Error deleting document: " << future.error_message()
                  << '\n';
      }
    });
  
Node.js
const res = await db.collection('cities').doc('DC').delete();
Đi
_, err := client.Collection("cities").Doc("DC").Delete(ctx)
if err != nil {
	// Handle any errors in an appropriate way, such as returning them.
	log.Printf("An error has occurred: %s", err)
}
PHP
$db->collection('cities')->document('DC')->delete();
Thống nhất
DocumentReference cityRef = db.Collection("cities").Document("DC");
cityRef.DeleteAsync();
C #
DocumentReference cityRef = db.Collection("cities").Document("DC");
await cityRef.DeleteAsync();
Ruby
city_ref = firestore.doc "#{collection_path}/DC"
city_ref.delete

Khi bạn xóa tài liệu, Cloud Firestore không tự động xóa tài liệu trong bộ sưu tập con của nó. Bạn vẫn có thể truy cập tài liệu bộ sưu tập con bằng cách tham khảo. Ví dụ: bạn có thể truy cập tài liệu tại đường dẫn /mycoll/mydoc/mysubcoll/mysubdoc ngay cả khi bạn xóa tài liệu gốc tại /mycoll/mydoc .

Các tài liệu gốc không tồn tại xuất hiện trong bảng điều khiển , nhưng chúng không xuất hiện trong kết quả truy vấn và ảnh chụp nhanh.

Nếu bạn muốn xóa một tài liệu và tất cả các tài liệu trong bộ sưu tập con của nó, bạn phải thực hiện thủ công. Để biết thêm thông tin, hãy xem Xóa bộ sưu tập .

Xóa các trường

Để xóa các trường cụ thể khỏi tài liệu, hãy sử dụng phương thức FieldValue.delete() khi bạn cập nhật tài liệu:

Web
var cityRef = db.collection('cities').doc('BJ');

// Remove the 'capital' field from the document
var removeCapital = cityRef.update({
    capital: firebase.firestore.FieldValue.delete()
});
Nhanh
db.collection("cities").document("BJ").updateData([
    "capital": FieldValue.delete(),
]) { err in
    if let err = err {
        print("Error updating document: \(err)")
    } else {
        print("Document successfully updated")
    }
}
Objective-C
[[[self.db collectionWithPath:@"cities"] documentWithPath:@"BJ"] updateData:@{
  @"capital": [FIRFieldValue fieldValueForDelete]
} completion:^(NSError * _Nullable error) {
  if (error != nil) {
    NSLog(@"Error updating document: %@", error);
  } else {
    NSLog(@"Document successfully updated");
  }
}];
  

Java

DocumentReference docRef = db.collection("cities").document("BJ");

// Remove the 'capital' field from the document
Map<String,Object> updates = new HashMap<>();
updates.put("capital", FieldValue.delete());

docRef.update(updates).addOnCompleteListener(new OnCompleteListener<Void>() {
    // ...
    // ...

Kotlin + KTX

val docRef = db.collection("cities").document("BJ")

// Remove the 'capital' field from the document
val updates = hashMapOf<String, Any>(
        "capital" to FieldValue.delete()
)

docRef.update(updates).addOnCompleteListener { }
Java
DocumentReference docRef = db.collection("cities").document("BJ");
Map<String, Object> updates = new HashMap<>();
updates.put("capital", FieldValue.delete());
// Update and delete the "capital" field in the document
ApiFuture<WriteResult> writeResult = docRef.update(updates);
System.out.println("Update time : " + writeResult.get());
Python
city_ref = db.collection(u'cities').document(u'BJ')
city_ref.update({
    u'capital': firestore.DELETE_FIELD
})
C ++
DocumentReference doc_ref = db->Collection("cities").Document("BJ");
doc_ref.Update({{"capital", FieldValue::Delete()}})
    .OnCompletion([](const Future<void>& future) { /*...*/ });
  
Node.js
// Get the `FieldValue` object
const FieldValue = admin.firestore.FieldValue;

// Create a document reference
const cityRef = db.collection('cities').doc('BJ');

// Remove the 'capital' field from the document
const res = await cityRef.update({
  capital: FieldValue.delete()
});
Đi
_, err := client.Collection("cities").Doc("BJ").Update(ctx, []firestore.Update{
	{
		Path:  "capital",
		Value: firestore.Delete,
	},
})
if err != nil {
	// Handle any errors in an appropriate way, such as returning them.
	log.Printf("An error has occurred: %s", err)
}
PHP
$cityRef = $db->collection('cities')->document('BJ');
$cityRef->update([
    ['path' => 'capital', 'value' => FieldValue::deleteField()]
]);
Thống nhất
DocumentReference cityRef = db.Collection("cities").Document("BJ");
Dictionary<string, object> updates = new Dictionary<string, object>
{
    { "Capital", FieldValue.Delete }
};
C #
DocumentReference cityRef = db.Collection("cities").Document("BJ");
Dictionary<string, object> updates = new Dictionary<string, object>
{
    { "Capital", FieldValue.Delete }
};
await cityRef.UpdateAsync(updates);
Ruby
city_ref = firestore.doc "#{collection_path}/BJ"
city_ref.update capital: firestore.field_delete

Xóa bộ sưu tập

Để xóa toàn bộ bộ sưu tập hoặc bộ sưu tập con trong Cloud Firestore, hãy truy xuất tất cả tài liệu trong bộ sưu tập hoặc bộ sưu tập con và xóa chúng. Nếu bạn có bộ sưu tập lớn hơn, bạn có thể muốn xóa tài liệu trong các lô nhỏ hơn để tránh lỗi hết bộ nhớ. Lặp lại quy trình cho đến khi bạn xóa toàn bộ bộ sưu tập hoặc bộ sưu tập con.

Xóa một bộ sưu tập yêu cầu phối hợp một số lượng yêu cầu xóa riêng lẻ không giới hạn. Nếu bạn cần xóa toàn bộ bộ sưu tập, chỉ làm như vậy từ môi trường máy chủ đáng tin cậy. Mặc dù có thể xóa bộ sưu tập khỏi ứng dụng di động / web, nhưng làm như vậy có tác động tiêu cực đến hiệu suất và bảo mật.

Các đoạn mã dưới đây được đơn giản hóa một chút và không liên quan đến việc xử lý lỗi, bảo mật, xóa các bộ sưu tập con hoặc tối đa hóa hiệu suất. Để tìm hiểu thêm về một phương pháp được đề xuất để xóa bộ sưu tập trong sản xuất, hãy xem Xóa bộ sưu tập và bộ sưu tập con .

Web
// Deleting collections from a Web client is not recommended.
Nhanh
// Deleting collections from an iOS client is not recommended.
Objective-C
// Deleting collections from an iOS client is not recommended.
  

Java

// Deleting collections from an Android client is not recommended.

Kotlin + KTX

// Deleting collections from an Android client is not recommended.
Java
/** Delete a collection in batches to avoid out-of-memory errors.
 * Batch size may be tuned based on document size (atmost 1MB) and application requirements.
 */
void deleteCollection(CollectionReference collection, int batchSize) {
  try {
    // retrieve a small batch of documents to avoid out-of-memory errors
    ApiFuture<QuerySnapshot> future = collection.limit(batchSize).get();
    int deleted = 0;
    // future.get() blocks on document retrieval
    List<QueryDocumentSnapshot> documents = future.get().getDocuments();
    for (QueryDocumentSnapshot document : documents) {
      document.getReference().delete();
      ++deleted;
    }
    if (deleted >= batchSize) {
      // retrieve and delete another batch
      deleteCollection(collection, batchSize);
    }
  } catch (Exception e) {
    System.err.println("Error deleting collection : " + e.getMessage());
  }
}
Python
def delete_collection(coll_ref, batch_size):
    docs = coll_ref.limit(batch_size).stream()
    deleted = 0

    for doc in docs:
        print(f'Deleting doc {doc.id} => {doc.to_dict()}')
        doc.reference.delete()
        deleted = deleted + 1

    if deleted >= batch_size:
        return delete_collection(coll_ref, batch_size)
C ++
// This is not supported. Delete data using CLI as discussed below.
  
Node.js
async function deleteCollection(db, collectionPath, batchSize) {
  const collectionRef = db.collection(collectionPath);
  const query = collectionRef.orderBy('__name__').limit(batchSize);

  return new Promise((resolve, reject) => {
    deleteQueryBatch(db, query, resolve).catch(reject);
  });
}

async function deleteQueryBatch(db, query, resolve) {
  const snapshot = await query.get();

  const batchSize = snapshot.size;
  if (batchSize === 0) {
    // When there are no documents left, we are done
    resolve();
    return;
  }

  // Delete documents in a batch
  const batch = db.batch();
  snapshot.docs.forEach((doc) => {
    batch.delete(doc.ref);
  });
  await batch.commit();

  // Recurse on the next process tick, to avoid
  // exploding the stack.
  process.nextTick(() => {
    deleteQueryBatch(db, query, resolve);
  });
}

Đi
func deleteCollection(ctx context.Context, client *firestore.Client,
	ref *firestore.CollectionRef, batchSize int) error {

	for {
		// Get a batch of documents
		iter := ref.Limit(batchSize).Documents(ctx)
		numDeleted := 0

		// Iterate through the documents, adding
		// a delete operation for each one to a
		// WriteBatch.
		batch := client.Batch()
		for {
			doc, err := iter.Next()
			if err == iterator.Done {
				break
			}
			if err != nil {
				return err
			}

			batch.Delete(doc.Ref)
			numDeleted++
		}

		// If there are no documents to delete,
		// the process is over.
		if numDeleted == 0 {
			return nil
		}

		_, err := batch.Commit(ctx)
		if err != nil {
			return err
		}
	}
}

PHP
function delete_collection($collectionReference, $batchSize)
{
    $documents = $collectionReference->limit($batchSize)->documents();
    while (!$documents->isEmpty()) {
        foreach ($documents as $document) {
            printf('Deleting document %s' . PHP_EOL, $document->id());
            $document->reference()->delete();
        }
        $documents = $collectionReference->limit($batchSize)->documents();
    }
}
Thống nhất
// This is not supported. Delete data using CLI as discussed below.
C #
private static async Task DeleteCollection(CollectionReference collectionReference, int batchSize)
{
    QuerySnapshot snapshot = await collectionReference.Limit(batchSize).GetSnapshotAsync();
    IReadOnlyList<DocumentSnapshot> documents = snapshot.Documents;
    while (documents.Count > 0)
    {
        foreach (DocumentSnapshot document in documents)
        {
            Console.WriteLine("Deleting document {0}", document.Id);
            await document.Reference.DeleteAsync();
        }
        snapshot = await collectionReference.Limit(batchSize).GetSnapshotAsync();
        documents = snapshot.Documents;
    }
    Console.WriteLine("Finished deleting all documents from the collection.");
}
Ruby
cities_ref = firestore.col collection_path
query      = cities_ref

query.get do |document_snapshot|
  puts "Deleting document #{document_snapshot.document_id}."
  document_ref = document_snapshot.ref
  document_ref.delete
end

Xóa dữ liệu bằng Firebase CLI

Bạn cũng có thể sử dụng Firebase CLI để xóa tài liệu và bộ sưu tập. Sử dụng lệnh sau để xóa dữ liệu:

firebase firestore:delete [options] <<path>>

Xóa dữ liệu bằng bảng điều khiển

Bạn có thể xóa tài liệu và bộ sưu tập khỏi trang Cloud Firestore trong bảng điều khiển . Việc xóa tài liệu khỏi bảng điều khiển sẽ xóa tất cả dữ liệu lồng nhau trong tài liệu đó, bao gồm mọi bộ sưu tập con.