This quickstart shows you how to set up Cloud Firestore, add data, then view
the data you just added in the Firebase console.
Cloud Firestore supports mobile or web SDKs and server client libraries:
Cloud Firestore supports SDKs for Android, iOS, and web and more. Combined with
Cloud Firestore Security Rules and Firebase Authentication, the mobile and web SDKs support
serverless app architectures where clients connect directly to your
Cloud Firestore database.
Cloud Firestore supports server client libraries for C#, Go, Java, Node.js, PHP,
Python, and Ruby. Use these client libraries to set up privileged server
environments with full access to your database. Learn more about these libraries
in the Quickstart for server client libraries.
Create a Cloud Firestore database
If you haven't already, create a Firebase project: In the
Firebase console, click Add project,
then follow the on-screen instructions to create a Firebase project or to
add Firebase services to an existing Google Cloud project.
Open your project in the Firebase console. In the left panel, expand
Build and then select
Firestore database.
If you aren't able to select a location, then your project's
"location for default Google Cloud resources"
has already been set. Some of your project's resources (like the default
Cloud Firestore instance) share a common location dependency, and
their location can be set either during project creation or when setting up
another service that shares this location dependency.
Select a starting mode for your Cloud Firestore Security Rules:
Test mode
Good for getting started with the mobile and web client libraries,
but allows anyone to read and overwrite your data. After testing, make
sure to review the Secure your data section.
To get started with the web, Apple platforms, or Android SDK, select test mode.
Production mode
Denies all reads and writes from mobile and web clients.
Your authenticated application servers (C#, Go, Java, Node.js, PHP,
Python, or Ruby) can still access your database.
To get started with the C#, Go, Java, Node.js, PHP, Python, or Ruby
server client library, select production mode.
Your initial set of Cloud Firestore Security Rules will apply to your default
Cloud Firestore database. If you create multiple databases for your
project, you can deploy Cloud Firestore Security Rules for each database.
Click Create.
When you enable Cloud Firestore, it also enables the API in the
Cloud API Manager.
Set up your development environment
Add the required dependencies and client libraries to your app.
Using the
Firebase Android BoM,
declare the dependency for the Cloud Firestore library for Android in
your module (app-level) Gradle file
(usually app/build.gradle.kts or
app/build.gradle).
dependencies{// Import the BoM for the Firebase platformimplementation(platform("com.google.firebase:firebase-bom:34.10.0"))// Declare the dependency for the Cloud Firestore library// When using the BoM, you don't specify versions in Firebase library dependenciesimplementation("com.google.firebase:firebase-firestore")}
By using the
Firebase Android BoM,
your app will always use compatible versions of the Firebase Android
libraries.
(Alternative)
Declare Firebase library dependencies without using the
BoM
If you choose not to use the Firebase BoM, you must specify each
Firebase library version in its dependency line.
Note that if you use multiple Firebase libraries in
your app, we highly recommend using the BoM to manage library
versions, which ensures that all versions are compatible.
dependencies{// Declare the dependency for the Cloud Firestore library// When NOT using the BoM, you must specify versions in Firebase library dependenciesimplementation("com.google.firebase:firebase-firestore:26.1.1")}
Looking for a Kotlin-specific library module? Starting with the
October 2023 release,
both Kotlin and Java developers can depend on the main library module
(for details, see the
FAQ about this initiative).
From the root of your Flutter project, run the following command to
install the plugin:
flutter pub add cloud_firestore
Once complete, rebuild your Flutter application:
flutter run
Optional: Improve iOS & macOS build times by including the
pre-compiled framework.
Currently, the Firestore SDK for iOS depends on code that can take
upwards of 5 minutes to build in Xcode. To reduce build times
significantly, you can use a pre-compiled version by adding this line to
the target 'Runner' do block in your Podfile:
target 'Runner' do
use_frameworks!
use_modular_headers!
pod 'FirebaseFirestore',
:git => 'https://github.com/invertase/firestore-ios-sdk-frameworks.git',
:tag => 'IOS_SDK_VERSION'
flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
target 'RunnerTests' do
inherit! :search_paths
end
end
Replace IOS_SDK_VERSION with the version of the Firebase iOS
SDK specified in firebase_core's
firebase_sdk_version.rb
file. If you're not using the latest version of
firebase_core, look for this file in your local Pub package
cache (usually ~/.pub-cache).
Additionally, ensure that you have upgraded CocoaPods to 1.9.1 or
higher:
Binary dependencies. Similarly, the recommended way to get
the binary dependencies is to add the following to your CMakeLists.txt
file:
add_subdirectory(${FIREBASE_CPP_SDK_DIR}bin/EXCLUDE_FROM_ALL)set(firebase_libsfirebase_authfirebase_firestorefirebase_app)# Replace the target name below with the actual name of your target,# for example, "native-lib".target_link_libraries(${YOUR_TARGET_NAME_HERE}"${firebase_libs}")
If, after enabling minification, the number of referenced methods still
exceeds the limit, another option is to enable multidex in:
mainTemplate.gradle if Custom Gradle Template under Player Settings is enabled
or, the module-level build.gradle file, if you use Android Studio to build the exported project.
(Optional) Prototype and test with Firebase Local Emulator Suite
For mobile developers, before talking about how your app writes to and reads
from Cloud Firestore, let's introduce a set of tools you can use to
prototype and test Cloud Firestore functionality:
Firebase Local Emulator Suite. If you're trying out different data models,
optimizing your security rules, or working to find the most cost-effective way
to interact with the back-end, being able to work locally without deploying
live services can be a great idea.
A Cloud Firestore emulator is part of the Local Emulator Suite, which
enables your app to interact with your emulated database content and config, as
well as optionally your emulated project resources (functions, other databases,
and security rules).
Using the Cloud Firestore emulator involves just a few steps:
Adding a line of code to your app's test config to connect to the emulator.
From the root of your local project directory, running firebase emulators:start.
Making calls from your app's prototype code using a Cloud Firestore platform
SDK as usual.
Cloud Firestore stores data in Documents, which are stored in Collections.
Cloud Firestore creates collections and documents implicitly
the first time you add data to the document. You do not need to explicitly
create collections or documents.
Create a new collection and a document using the following example code.
Web
import{collection,addDoc}from"firebase/firestore";try{constdocRef=awaitaddDoc(collection(db,"users"),{first:"Ada",last:"Lovelace",born:1815});console.log("Document written with ID: ",docRef.id);}catch(e){console.error("Error adding document: ",e);}
Web
db.collection("users").add({first:"Ada",last:"Lovelace",born:1815}).then((docRef)=>{console.log("Document written with ID: ",docRef.id);}).catch((error)=>{console.error("Error adding document: ",error);});
Swift
Note: This product is not available on watchOS and App Clip targets.
// Add a new document with a generated IDdo{letref=tryawaitdb.collection("users").addDocument(data:["first":"Ada","last":"Lovelace","born":1815])print("Document added with ID: \(ref.documentID)")}catch{print("Error adding document: \(error)")}
Objective-C
Note: This product is not available on watchOS and App Clip targets.
// Add a new document with a generated ID__blockFIRDocumentReference*ref=[[self.dbcollectionWithPath:@"users"]addDocumentWithData:@{@"first":@"Ada",@"last":@"Lovelace",@"born":@1815}completion:^(NSError*_Nullableerror){if(error!=nil){NSLog(@"Error adding document: %@",error);}else{NSLog(@"Document added with ID: %@",ref.documentID);}}];
Kotlin
// Create a new user with a first and last namevaluser=hashMapOf("first"to"Ada","last"to"Lovelace","born"to1815,)// Add a new document with a generated IDdb.collection("users").add(user).addOnSuccessListener{documentReference->
Log.d(TAG,"DocumentSnapshot added with ID: ${documentReference.id}")}.addOnFailureListener{e->
Log.w(TAG,"Error adding document",e)}
Java
// Create a new user with a first and last nameMap<String,Object>user=newHashMap<>();user.put("first","Ada");user.put("last","Lovelace");user.put("born",1815);// Add a new document with a generated IDdb.collection("users").add(user).addOnSuccessListener(newOnSuccessListener<DocumentReference>(){@OverridepublicvoidonSuccess(DocumentReferencedocumentReference){Log.d(TAG,"DocumentSnapshot added with ID: "+documentReference.getId());}}).addOnFailureListener(newOnFailureListener(){@OverridepublicvoidonFailure(@NonNullExceptione){Log.w(TAG,"Error adding document",e);}});
Dart
// Create a new user with a first and last namefinaluser=<String,dynamic>{"first":"Ada","last":"Lovelace","born":1815};// Add a new document with a generated IDdb.collection("users").add(user).then((DocumentReferencedoc)=>
print('DocumentSnapshot added with ID: ${doc.id}'));
C++
// Add a new document with a generated IDFuture<DocumentReference>user_ref=db->Collection("users").Add({{"first", FieldValue::String("Ada")},
{"last", FieldValue::String("Lovelace")},
{"born", FieldValue::Integer(1815)}});user_ref.OnCompletion([](constFuture<DocumentReference>&future){if(future.error()==Error::kErrorOk){std::cout << "DocumentSnapshot added with ID: " << future.result()->id() << std::endl;}else{std::cout << "Error adding document: " << future.error_message() << std::endl;}});
Unity
DocumentReferencedocRef=db.Collection("users").Document("alovelace");Dictionary<string,object>user=newDictionary<string,object>
{{"First","Ada"},{"Last","Lovelace"},{"Born",1815},};docRef.SetAsync(user).ContinueWithOnMainThread(task=>{Debug.Log("Added data to the alovelace document in the users collection.");});
Now add another document to the users collection. Notice that this document
includes a key-value pair (middle name) that does not appear in the first
document. Documents in a collection can contain different sets of information.
Web
// Add a second document with a generated ID.import{addDoc,collection}from"firebase/firestore";try{constdocRef=awaitaddDoc(collection(db,"users"),{first:"Alan",middle:"Mathison",last:"Turing",born:1912});console.log("Document written with ID: ",docRef.id);}catch(e){console.error("Error adding document: ",e);}
Web
// Add a second document with a generated ID.db.collection("users").add({first:"Alan",middle:"Mathison",last:"Turing",born:1912}).then((docRef)=>{console.log("Document written with ID: ",docRef.id);}).catch((error)=>{console.error("Error adding document: ",error);});
Swift
Note: This product is not available on watchOS and App Clip targets.
// Add a second document with a generated ID.do{letref=tryawaitdb.collection("users").addDocument(data:["first":"Alan","middle":"Mathison","last":"Turing","born":1912])print("Document added with ID: \(ref.documentID)")}catch{print("Error adding document: \(error)")}
Objective-C
Note: This product is not available on watchOS and App Clip targets.
// Add a second document with a generated ID.__blockFIRDocumentReference*ref=[[self.dbcollectionWithPath:@"users"]addDocumentWithData:@{@"first":@"Alan",@"middle":@"Mathison",@"last":@"Turing",@"born":@1912}completion:^(NSError*_Nullableerror){if(error!=nil){NSLog(@"Error adding document: %@",error);}else{NSLog(@"Document added with ID: %@",ref.documentID);}}];
Kotlin
// Create a new user with a first, middle, and last namevaluser=hashMapOf("first"to"Alan","middle"to"Mathison","last"to"Turing","born"to1912,)// Add a new document with a generated IDdb.collection("users").add(user).addOnSuccessListener{documentReference->
Log.d(TAG,"DocumentSnapshot added with ID: ${documentReference.id}")}.addOnFailureListener{e->
Log.w(TAG,"Error adding document",e)}
Java
// Create a new user with a first, middle, and last nameMap<String,Object>user=newHashMap<>();user.put("first","Alan");user.put("middle","Mathison");user.put("last","Turing");user.put("born",1912);// Add a new document with a generated IDdb.collection("users").add(user).addOnSuccessListener(newOnSuccessListener<DocumentReference>(){@OverridepublicvoidonSuccess(DocumentReferencedocumentReference){Log.d(TAG,"DocumentSnapshot added with ID: "+documentReference.getId());}}).addOnFailureListener(newOnFailureListener(){@OverridepublicvoidonFailure(@NonNullExceptione){Log.w(TAG,"Error adding document",e);}});
Dart
// Create a new user with a first and last namefinaluser=<String,dynamic>{"first":"Alan","middle":"Mathison","last":"Turing","born":1912};// Add a new document with a generated IDdb.collection("users").add(user).then((DocumentReferencedoc)=>
print('DocumentSnapshot added with ID: ${doc.id}'));
DocumentReferencedocRef=db.Collection("users").Document("aturing");Dictionary<string,object>user=newDictionary<string,object>
{{"First","Alan"},{"Middle","Mathison"},{"Last","Turing"},{"Born",1912}};docRef.SetAsync(user).ContinueWithOnMainThread(task=>{Debug.Log("Added data to the aturing document in the users collection.");});
Read data
Use the data viewer in the
Firebase console
to quickly verify that you've added data to Cloud Firestore.
You can also use the "get" method to retrieve the entire collection.
CollectionReferenceusersRef=db.Collection("users");usersRef.GetSnapshotAsync().ContinueWithOnMainThread(task=>
{QuerySnapshotsnapshot=task.Result;foreach(DocumentSnapshotdocumentinsnapshot.Documents){Debug.Log(String.Format("User: {0}",document.Id));Dictionary<string,object>documentDictionary=document.ToDictionary();Debug.Log(String.Format("First: {0}",documentDictionary["First"]));if(documentDictionary.ContainsKey("Middle")){Debug.Log(String.Format("Middle: {0}",documentDictionary["Middle"]));}Debug.Log(String.Format("Last: {0}",documentDictionary["Last"]));Debug.Log(String.Format("Born: {0}",documentDictionary["Born"]));}Debug.Log("Read all data from the users collection.");});
Here are some basic rule sets you can use to get started. You can modify your
security rules in the Rules
tab of
the console.
Auth required
// Allow read/write access to a document keyed by the user's UIDservicecloud.firestore{match/databases/{database}/documents{match/users/{uid}{allowread,write:ifrequest.auth!=null && request.auth.uid==uid;}}}
Production mode
// Deny read/write access to all users under any conditionsservicecloud.firestore{match/databases/{database}/documents{match/{document=**}{allowread,write:iffalse;}}}
Before you deploy your web, Android, or iOS app to production, also take steps
to ensure that only your app clients can access your Cloud Firestore data.
See the App Check documentation.
[[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Missing the information I need","missingTheInformationINeed","thumb-down"],["Too complicated / too many steps","tooComplicatedTooManySteps","thumb-down"],["Out of date","outOfDate","thumb-down"],["Samples / code issue","samplesCodeIssue","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2026-02-27 UTC."],[],[]]