Check out what’s new from Firebase@ Google I/O 2021, and join our alpha program for early access to the new Remote Config personalization feature. Learn more

開始使用 Cloud Firestore

本快速入門向您展示瞭如何設置 Cloud Firestore、添加數據,然後在 Firebase 控制台中查看您剛剛添加的數據。

創建 Cloud Firestore 數據庫

  1. 如果您還沒有創建 Firebase 項目:在Firebase 控制台中,點擊添加項目,然後按照屏幕上的說明創建 Firebase 項目或將 Firebase 服務添加到現有 GCP 項目。

  2. 導航到Firebase 控制台Cloud Firestore部分。系統會提示您選擇一個現有的 Firebase 項目。遵循數據庫創建工作流程。

  3. 為您的 Cloud Firestore 安全規則選擇一種啟動模式:

    測試模式

    適合開始使用移動和 Web 客戶端庫,但允許任何人讀取和覆蓋您的數據。測試後,請務必查看保護您的數據部分。

    要開始使用 Web、iOS 或 Android SDK,請選擇測試模式。

    鎖定模式

    拒絕來自移動和 Web 客戶端的所有讀取和寫入。經過身份驗證的應用程序服務器(C#、Go、Java、Node.js、PHP、Python 或 Ruby)仍然可以訪問您的數據庫。

    要開始使用 C#、Go、Java、Node.js、PHP、Python 或 Ruby 服務器客戶端庫,請選擇鎖定模式。

  4. 為您的數據庫選擇一個位置

    • 此位置設置是您項目的默認 Google Cloud Platform (GCP) 資源位置。請注意,此位置將用於您項目中需要位置設置的 GCP 服務,特別是您的默認Cloud Storage 存儲分區和您的App Engine應用程序(如果您使用 Cloud Scheduler,則這是必需的)。

    • 如果您無法選擇位置,則您的項目已經具有默認 GCP 資源位置。它是在項目創建期間或在設置另一個需要位置設置的服務時設置的。

  5. 單擊完成

當您啟用 Cloud Firestore 時,它也會啟用Cloud API Manager中的API

設置您的開發環境

將所需的依賴項和客戶端庫添加到您的應用程序。

網頁版 v8

  1. 按照說明將 Firebase 添加到您的網絡應用程序
  2. 將 Firebase 和 Cloud Firestore 庫添加到您的應用:
    <script src="https://www.gstatic.com/firebasejs/8.6.7/firebase-app.js"></script>
    <script src="https://www.gstatic.com/firebasejs/8.6.7/firebase-firestore.js"></script>
    Cloud Firestore SDK 也可作為 npm 包使用。
    npm install firebase@8.6.7 --save
    
    您需要手動要求 Firebase 和 Cloud Firestore。
    const firebase = require("firebase");
    // Required for side-effects
    require("firebase/firestore");
    

網頁版 v9

  1. 按照說明將 Firebase 添加到您的網絡應用程序
  2. Cloud Firestore SDK 以 npm 包的形式提供。
    npm install firebase@9.0.0-beta.2 --save
    
    您需要同時導入 Firebase 和 Cloud Firestore。
    import { initializeApp } from "firebase/app";
    import { getFirestore } from "firebase/firestore";
    
IOS
  1. 按照說明將 Firebase 添加到您的 iOS 應用
  2. 將 Cloud Firestore pod 添加到您的Podfile
    pod 'Firebase/Firestore'
    
    # Optionally, include the Swift extensions if you're using Swift.
    pod 'FirebaseFirestoreSwift'
    
  3. 保存文件並運行pod install

爪哇

  1. 按照說明將 Firebase 添加到您的 Android 應用
  2. 使用Firebase Android BoM在您的模塊(應用級)Gradle 文件(通常是app/build.gradle )中聲明 Cloud Firestore Android 庫的依賴app/build.gradle
    dependencies {
        // Import the BoM for the Firebase platform
        implementation platform('com.google.firebase:firebase-bom:28.1.0')
    
        // Declare the dependency for the Cloud Firestore library
        // When using the BoM, you don't specify versions in Firebase library dependencies
        implementation 'com.google.firebase:firebase-firestore'
    }
    

    通過使用Firebase Android BoM ,您的應用將始終使用 Firebase Android 庫的兼容版本。

    (替代)在使用 BoM 的情況下聲明 Firebase 庫依賴項

    如果您選擇不使用 Firebase BoM,則必須在其依賴項行中指定每個 Firebase 庫版本。

    請注意,如果您在應用中使用多個Firebase 庫,我們強烈建議您使用 BoM 來管理庫版本,以確保所有版本都兼容。

    dependencies {
        // Declare the dependency for the Cloud Firestore library
        // When NOT using the BoM, you must specify versions in Firebase library dependencies
        implementation 'com.google.firebase:firebase-firestore:23.0.1'
    }
    

科特林+KTX

  1. 按照說明將 Firebase 添加到您的 Android 應用
  2. 使用Firebase Android BoM在您的模塊(應用級)Gradle 文件(通常是app/build.gradle )中聲明 Cloud Firestore Android 庫的依賴app/build.gradle
    dependencies {
        // Import the BoM for the Firebase platform
        implementation platform('com.google.firebase:firebase-bom:28.1.0')
    
        // Declare the dependency for the Cloud Firestore library
        // When using the BoM, you don't specify versions in Firebase library dependencies
        implementation 'com.google.firebase:firebase-firestore-ktx'
    }
    

    通過使用Firebase Android BoM ,您的應用將始終使用 Firebase Android 庫的兼容版本。

    (替代)在使用 BoM 的情況下聲明 Firebase 庫依賴項

    如果您選擇不使用 Firebase BoM,則必須在其依賴項行中指定每個 Firebase 庫版本。

    請注意,如果您在應用中使用多個Firebase 庫,我們強烈建議您使用 BoM 來管理庫版本,以確保所有版本都兼容。

    dependencies {
        // Declare the dependency for the Cloud Firestore library
        // When NOT using the BoM, you must specify versions in Firebase library dependencies
        implementation 'com.google.firebase:firebase-firestore-ktx:23.0.1'
    }
    
爪哇
  1. 將 Firebase Admin SDK 添加到您的應用:
    • 使用搖籃:
      compile 'com.google.firebase:firebase-admin:7.3.0'
      
    • 使用 Maven:
      <dependency>
        <groupId>com.google.firebase</groupId>
        <artifactId>firebase-admin</artifactId>
        <version>7.3.0</version>
      </dependency>
           
  2. 按照以下說明在您的環境中使用正確的憑據初始化 Cloud Firestore。
Python
  1. 將 Firebase Admin SDK 添加到您的 Python 應用:
    pip install --upgrade firebase-admin
  2. 按照以下說明在您的環境中使用正確的憑據初始化 Cloud Firestore。
C++
  1. 按照說明將 Firebase 添加到您的 C++ 項目
  2. 適用於 Android 的 C++ 接口。
    • Gradle 依賴項。將以下內容添加到您的模塊(應用程序級)Gradle 文件(通常為app/build.gradle ):
              android.defaultConfig.externalNativeBuild.cmake {
                arguments "-DFIREBASE_CPP_SDK_DIR=$gradle.firebase_cpp_sdk_dir"
              }
      
              apply from: "$gradle.firebase_cpp_sdk_dir/Android/firebase_dependencies.gradle"
              firebaseCpp.dependencies {
                // earlier entries
                auth
                firestore
              }
              
    • 二進制依賴。同樣,獲取二進制依賴項的推薦方法是將以下內容添加到CMakeLists.txt文件中:
              add_subdirectory(${FIREBASE_CPP_SDK_DIR} bin/ EXCLUDE_FROM_ALL)
              set(firebase_libs firebase_auth firebase_firestore firebase_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}")
              
  3. 要設置桌面集成,請參閱將 Firebase 添加到您的 C++ 項目
統一
  1. 按照說明將 Firebase 添加到您的 Unity 項目
  2. Android 的 Unity 界面。
  3. 在為 Android 構建時,啟用 ProGuarding 以避免 Android DEX 限制。為此,請在 Unity 編輯器中:

    1. 選擇文件 > 構建設置
    2. 將“平台”切換到“Android”,然後單擊“切換平台”
    3. 單擊“播放器設置...”
    4. 在主 Unity UI 中,在“Android 設置”下,選擇“發佈設置”
    5. 在“縮小”部分下,將發布和調試設置從“無”更改為“ProGuard”
節點.js
  1. 將 Firebase Admin SDK 添加到您的應用:
    npm install firebase-admin --save
  2. 按照以下說明在您的環境中使用正確的憑據初始化 Cloud Firestore。
  1. 將 Firebase Admin SDK 添加到您的 Go 應用:
    go get firebase.google.com/go
    
  2. 按照以下說明在您的環境中使用正確的憑據初始化 Cloud Firestore。
PHP
  1. Cloud Firestore 服務器客戶端庫(Java、Node.js、Python、Go、PHP、C# 和 Ruby)使用Google 應用默認憑據進行身份驗證。
    • 要從您的開發環境進行身份驗證,請將GOOGLE_APPLICATION_CREDENTIALS環境變量設置為指向 JSON 服務帳戶密鑰文件。您可以在API 控制台憑據頁面上創建密鑰文件。
      export GOOGLE_APPLICATION_CREDENTIALS="path/to/your/keyfile.json"
    • 在您的生產環境中,如果您使用與 Cloud Firestore 相同的項目在 App Engine 或 Compute Engine 上運行應用程序,則無需進行身份驗證。否則,設置一個服務帳戶
  2. 安裝並啟用 PHP 的gRPC 擴展,您將需要使用客戶端庫。
  3. 將 Cloud Firestore PHP 庫添加到您的應用:
    composer require google/cloud-firestore
C#
  1. Cloud Firestore 服務器客戶端庫(Java、Node.js、Python、Go、PHP、C# 和 Ruby)使用Google 應用默認憑據進行身份驗證。
    • 要從您的開發環境進行身份驗證,請將GOOGLE_APPLICATION_CREDENTIALS環境變量設置為指向 JSON 服務帳戶密鑰文件。您可以在API 控制台憑據頁面上創建密鑰文件。
      export GOOGLE_APPLICATION_CREDENTIALS="path/to/your/keyfile.json"
    • 在您的生產環境中,如果您使用與 Cloud Firestore 相同的項目在 App Engine 或 Compute Engine 上運行應用程序,則無需進行身份驗證。否則,設置一個服務帳戶
  2. 將 Cloud Firestore C# 庫添加到您的.csproj文件中的應用程序:
    <ItemGroup>
      <PackageReference Include="Google.Cloud.Firestore" Version="1.1.0-beta01" />
    </ItemGroup>
  3. 將以下內容添加到您的Program.cs文件中:
    using Google.Cloud.Firestore;
紅寶石
  1. Cloud Firestore 服務器客戶端庫(Java、Node.js、Python、Go、PHP、C# 和 Ruby)使用Google 應用默認憑據進行身份驗證。
    • 要從您的開發環境進行身份驗證,請將GOOGLE_APPLICATION_CREDENTIALS環境變量設置為指向 JSON 服務帳戶密鑰文件。您可以在API 控制台憑據頁面上創建密鑰文件。
      export GOOGLE_APPLICATION_CREDENTIALS="path/to/your/keyfile.json"
    • 在您的生產環境中,如果您使用與 Cloud Firestore 相同的項目在 App Engine 或 Compute Engine 上運行應用程序,則無需進行身份驗證。否則,設置一個服務帳戶
  2. 將 Cloud Firestore Ruby 庫添加到您的Gemfile的應用程序:
    gem "google-cloud-firestore"
  3. 使用以下命令從Gemfile安裝依賴Gemfile
    bundle install

(可選)使用 Firebase 本地模擬器套件進行原型設計和測試

對於移動開發人員,在討論您的應用如何寫入和讀取 Cloud Firestore 之前,讓我們介紹一組可用於原型和測試 Cloud Firestore 功能的工具:Firebase Local Emulator Suite。如果您正在嘗試不同的數據模型、優化您的安全規則,或者正在努力尋找與後端交互的最具成本效益的方式,那麼能夠在不部署實時服務的情況下在本地工作可能是一個好主意。

Cloud Firestore 模擬器是本地模擬器套件的一部分,它使您的應用能夠與模擬的數據庫內容和配置以及可選的模擬項目資源(函數、其他數據庫和安全規則)進行交互。

使用 Cloud Firestore 模擬器只需幾個步驟:

  1. 在應用程序的測試配置中添加一行代碼以連接到模擬器。
  2. 從本地項目目錄的根目錄,運行firebase emulators:start
  3. 像往常一樣使用 Cloud Firestore 平台 SDK 從應用的原型代碼進行調用。

提供了涉及 Cloud Firestore 和 Cloud Functions 的詳細演練。您還應該查看Local Emulator Suite 介紹

初始化 Cloud Firestore

初始化 Cloud Firestore 的一個實例:

網頁版 v8

// Initialize Cloud Firestore through Firebase
firebase.initializeApp({
  apiKey: '### FIREBASE API KEY ###',
  authDomain: '### FIREBASE AUTH DOMAIN ###',
  projectId: '### CLOUD FIRESTORE PROJECT ID ###'
});

var db = firebase.firestore();
`initializeApp` 的值可以在您的網絡應用程序的` firebaseConfig` 中找到。要在設備失去連接時保留數據,請參閱啟用離線數據文檔。

網頁版 v9

// Initialize Cloud Firestore through Firebase
import { initializeApp } from "firebase/app"
import { getFirestore } from "firebase/firestore"
const firebaseApp = initializeApp({
  apiKey: '### FIREBASE API KEY ###',
  authDomain: '### FIREBASE AUTH DOMAIN ###',
  projectId: '### CLOUD FIRESTORE PROJECT ID ###'
});

const db = getFirestore();
`initializeApp` 的值可以在您的網絡應用程序的` firebaseConfig` 中找到。要在設備失去連接時保留數據,請參閱啟用離線數據文檔。
迅速
import Firebase
FirebaseApp.configure()

let db = Firestore.firestore()
目標-C
@import Firebase;

// Use Firebase library to configure APIs
[FIRApp configure];
  
FIRFirestore *defaultFirestore = [FIRFirestore firestore];

爪哇

// Access a Cloud Firestore instance from your Activity
FirebaseFirestore db = FirebaseFirestore.getInstance();

科特林+KTX

// Access a Cloud Firestore instance from your Activity
val db = Firebase.firestore
爪哇
Cloud Firestore SDK 根據您的環境以不同方式初始化。下面是最常用的方法。有關完整參考,請參閱初始化 Admin SDK
  • 在 Google Cloud Platform 上初始化
    import com.google.auth.oauth2.GoogleCredentials;
    import com.google.cloud.firestore.Firestore;
    
    import com.google.firebase.FirebaseApp;
    import com.google.firebase.FirebaseOptions;
    
    // Use the application default credentials
    GoogleCredentials credentials = GoogleCredentials.getApplicationDefault();
    FirebaseOptions options = new FirebaseOptions.Builder()
        .setCredentials(credentials)
        .setProjectId(projectId)
        .build();
    FirebaseApp.initializeApp(options);
    
    Firestore db = FirestoreClient.getFirestore();
    
  • 在你自己的服務器上初始化

    要在您自己的服務器上使用 Firebase Admin SDK,請使用服務帳戶

    轉到 Cloud Platform Console 中的IAM 和管理 > 服務帳戶。生成新的私鑰並保存 JSON 文件。然後使用該文件初始化SDK:

    import com.google.auth.oauth2.GoogleCredentials;
    import com.google.cloud.firestore.Firestore;
    
    import com.google.firebase.FirebaseApp;
    import com.google.firebase.FirebaseOptions;
    
    // Use a service account
    InputStream serviceAccount = new FileInputStream("path/to/serviceAccount.json");
    GoogleCredentials credentials = GoogleCredentials.fromStream(serviceAccount);
    FirebaseOptions options = new FirebaseOptions.Builder()
        .setCredentials(credentials)
        .build();
    FirebaseApp.initializeApp(options);
    
    Firestore db = FirestoreClient.getFirestore();
    
  • Python
    Cloud Firestore SDK 根據您的環境以不同方式初始化。下面是最常用的方法。有關完整參考,請參閱初始化 Admin SDK
  • 在 Google Cloud Platform 上初始化
    import firebase_admin
    from firebase_admin import credentials
    from firebase_admin import firestore
    
    # Use the application default credentials
    cred = credentials.ApplicationDefault()
    firebase_admin.initialize_app(cred, {
      'projectId': project_id,
    })
    
    db = firestore.client()
    
  • 在你自己的服務器上初始化

    要在您自己的服務器上使用 Firebase Admin SDK,請使用服務帳戶

    轉到 Cloud Platform Console 中的IAM 和管理 > 服務帳戶。生成新的私鑰並保存 JSON 文件。然後使用該文件初始化SDK:

    import firebase_admin
    from firebase_admin import credentials
    from firebase_admin import firestore
    
    # Use a service account
    cred = credentials.Certificate('path/to/serviceAccount.json')
    firebase_admin.initialize_app(cred)
    
    db = firestore.client()
    
  • C++
    // Make sure the call to `Create()` happens some time before you call Firestore::GetInstance().
    App::Create();
    Firestore* db = Firestore::GetInstance();
    節點.js
    Cloud Firestore SDK 根據您的環境以不同方式初始化。下面是最常用的方法。有關完整參考,請參閱初始化 Admin SDK
    • 在 Cloud Functions 上初始化
      const admin = require('firebase-admin');
      admin.initializeApp();
      
      const db = admin.firestore();
      
    • 在 Google Cloud Platform 上初始化
      const admin = require('firebase-admin');
      admin.initializeApp({
        credential: admin.credential.applicationDefault()
      });
      
      const db = admin.firestore();
    • 在你自己的服務器上初始化

      要在您自己的服務器(或任何其他 Node.js 環境)上使用 Firebase Admin SDK,請使用服務帳戶。轉到 Cloud Platform Console 中的IAM 和管理 > 服務帳戶。生成新的私鑰並保存 JSON 文件。然後使用該文件初始化SDK:

      const admin = require('firebase-admin');
      const serviceAccount = require('./path/to/serviceAccountKey.json');
      
      admin.initializeApp({
        credential: admin.credential.cert(serviceAccount)
      });
      
      const db = admin.firestore();
      
    Cloud Firestore SDK 根據您的環境以不同方式初始化。下面是最常用的方法。有關完整參考,請參閱初始化 Admin SDK
  • 在 Google Cloud Platform 上初始化
    import (
      "log"
    
      firebase "firebase.google.com/go"
      "google.golang.org/api/option"
    )
    
    // Use the application default credentials
    ctx := context.Background()
    conf := &firebase.Config{ProjectID: projectID}
    app, err := firebase.NewApp(ctx, conf)
    if err != nil {
      log.Fatalln(err)
    }
    
    client, err := app.Firestore(ctx)
    if err != nil {
      log.Fatalln(err)
    }
    defer client.Close()
    
  • 在你自己的服務器上初始化

    要在您自己的服務器上使用 Firebase Admin SDK,請使用服務帳戶

    轉到 Cloud Platform Console 中的IAM 和管理 > 服務帳戶。生成新的私鑰並保存 JSON 文件。然後使用該文件初始化SDK:

    import (
      "log"
    
      firebase "firebase.google.com/go"
      "google.golang.org/api/option"
    )
    
    // Use a service account
    ctx := context.Background()
    sa := option.WithCredentialsFile("path/to/serviceAccount.json")
    app, err := firebase.NewApp(ctx, nil, sa)
    if err != nil {
      log.Fatalln(err)
    }
    
    client, err := app.Firestore(ctx)
    if err != nil {
      log.Fatalln(err)
    }
    defer client.Close()
    
  • PHP
    use Google\Cloud\Firestore\FirestoreClient;
    
    /**
     * Initialize Cloud Firestore with default project ID.
     * ```
     * setup_client_create();
     * ```
     */
    function setup_client_create()
    {
        // Create the Cloud Firestore client
        $db = new FirestoreClient();
        printf('Created Cloud Firestore client with default project ID.' . PHP_EOL);
    }
    統一
    using Firebase.Firestore;
    using Firebase.Extensions;
    FirebaseFirestore db = FirebaseFirestore.DefaultInstance;
    C#
    FirestoreDb db = FirestoreDb.Create(project);
    Console.WriteLine("Created Cloud Firestore client with project ID: {0}", project);
    紅寶石
    require "google/cloud/firestore"
    
    firestore = Google::Cloud::Firestore.new project_id: project_id
    
    puts "Created Cloud Firestore client with given project ID."

    添加數據

    Cloud Firestore 將數據存儲在文檔中,文檔存儲在集合中。首次向文檔添加數據時,Cloud Firestore 會隱式創建集合和文檔。您不需要顯式創建集合或文檔。

    使用以下示例代碼創建一個新集合和一個文檔。

    網頁版 v8

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

    網頁版 v9

    import { collection, addDoc } from "firebase/firestore"; 
    
    try {
      const docRef = await addDoc(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);
    }
    迅速
    // Add a new document with a generated ID
    var ref: DocumentReference? = nil
    ref = db.collection("users").addDocument(data: [
        "first": "Ada",
        "last": "Lovelace",
        "born": 1815
    ]) { err in
        if let err = err {
            print("Error adding document: \(err)")
        } else {
            print("Document added with ID: \(ref!.documentID)")
        }
    }
    目標-C
    // Add a new document with a generated ID
    __block FIRDocumentReference *ref =
        [[self.db collectionWithPath:@"users"] addDocumentWithData:@{
          @"first": @"Ada",
          @"last": @"Lovelace",
          @"born": @1815
        } completion:^(NSError * _Nullable error) {
          if (error != nil) {
            NSLog(@"Error adding document: %@", error);
          } else {
            NSLog(@"Document added with ID: %@", ref.documentID);
          }
        }];

    爪哇

    // Create a new user with a first and last name
    Map<String, Object> user = new HashMap<>();
    user.put("first", "Ada");
    user.put("last", "Lovelace");
    user.put("born", 1815);
    
    // Add a new document with a generated ID
    db.collection("users")
            .add(user)
            .addOnSuccessListener(new OnSuccessListener<DocumentReference>() {
                @Override
                public void onSuccess(DocumentReference documentReference) {
                    Log.d(TAG, "DocumentSnapshot added with ID: " + documentReference.getId());
                }
            })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Log.w(TAG, "Error adding document", e);
                }
            });

    科特林+KTX

    // Create a new user with a first and last name
    val user = hashMapOf(
            "first" to "Ada",
            "last" to "Lovelace",
            "born" to 1815
    )
    
    // Add a new document with a generated ID
    db.collection("users")
        .add(user)
        .addOnSuccessListener { documentReference ->
            Log.d(TAG, "DocumentSnapshot added with ID: ${documentReference.id}")
        }
        .addOnFailureListener { e ->
            Log.w(TAG, "Error adding document", e)
        }
    爪哇
    DocumentReference docRef = db.collection("users").document("alovelace");
    // Add document data  with id "alovelace" using a hashmap
    Map<String, Object> data = new HashMap<>();
    data.put("first", "Ada");
    data.put("last", "Lovelace");
    data.put("born", 1815);
    //asynchronously write data
    ApiFuture<WriteResult> result = docRef.set(data);
    // ...
    // result.get() blocks on response
    System.out.println("Update time : " + result.get().getUpdateTime());
    Python
    doc_ref = db.collection(u'users').document(u'alovelace')
    doc_ref.set({
        u'first': u'Ada',
        u'last': u'Lovelace',
        u'born': 1815
    })
    C++
    // Add a new document with a generated ID
    Future<DocumentReference> user_ref =
        db->Collection("users").Add({{"first", FieldValue::String("Ada")},
                                     {"last", FieldValue::String("Lovelace")},
                                     {"born", FieldValue::Integer(1815)}});
    
    user_ref.OnCompletion([](const Future<DocumentReference>& future) {
      if (future.error() == Error::kErrorOk) {
        std::cout << "DocumentSnapshot added with ID: " << future.result()->id()
                  << '\n';
      } else {
        std::cout << "Error adding document: " << future.error_message() << '\n';
      }
    });
    節點.js
    const docRef = db.collection('users').doc('alovelace');
    
    await docRef.set({
      first: 'Ada',
      last: 'Lovelace',
      born: 1815
    });
    _, _, err := client.Collection("users").Add(ctx, map[string]interface{}{
    	"first": "Ada",
    	"last":  "Lovelace",
    	"born":  1815,
    })
    if err != nil {
    	log.Fatalf("Failed adding alovelace: %v", err)
    }
    PHP
    $docRef = $db->collection('samples/php/users')->document('lovelace');
    $docRef->set([
        'first' => 'Ada',
        'last' => 'Lovelace',
        'born' => 1815
    ]);
    printf('Added data to the lovelace document in the users collection.' . PHP_EOL);
    統一
    DocumentReference docRef = db.Collection("users").Document("alovelace");
    Dictionary<string, object> user = new Dictionary<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.");
    });
    C#
    DocumentReference docRef = db.Collection("users").Document("alovelace");
    Dictionary<string, object> user = new Dictionary<string, object>
    {
        { "First", "Ada" },
        { "Last", "Lovelace" },
        { "Born", 1815 }
    };
    await docRef.SetAsync(user);
    紅寶石
    doc_ref = firestore.doc "#{collection_path}/alovelace"
    
    doc_ref.set(
      {
        first: "Ada",
        last:  "Lovelace",
        born:  1815
      }
    )
    
    puts "Added data to the alovelace document in the users collection."

    現在將另一個文檔添加到users集合中。請注意,此文檔包含未出現在第一個文檔中的鍵值對(中間名)。集合中的文檔可以包含不同的信息集。

    網頁版 v8

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

    網頁版 v9

    // Add a second document with a generated ID.
    import { addDoc, collection } from "firebase/firestore"; 
    
    try {
      const docRef = await addDoc(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);
    }
    迅速
    // Add a second document with a generated ID.
    ref = db.collection("users").addDocument(data: [
        "first": "Alan",
        "middle": "Mathison",
        "last": "Turing",
        "born": 1912
    ]) { err in
        if let err = err {
            print("Error adding document: \(err)")
        } else {
            print("Document added with ID: \(ref!.documentID)")
        }
    }
    目標-C
    // Add a second document with a generated ID.
    __block FIRDocumentReference *ref =
        [[self.db collectionWithPath:@"users"] addDocumentWithData:@{
          @"first": @"Alan",
          @"middle": @"Mathison",
          @"last": @"Turing",
          @"born": @1912
        } completion:^(NSError * _Nullable error) {
          if (error != nil) {
            NSLog(@"Error adding document: %@", error);
          } else {
            NSLog(@"Document added with ID: %@", ref.documentID);
          }
        }];

    爪哇

    // Create a new user with a first, middle, and last name
    Map<String, Object> user = new HashMap<>();
    user.put("first", "Alan");
    user.put("middle", "Mathison");
    user.put("last", "Turing");
    user.put("born", 1912);
    
    // Add a new document with a generated ID
    db.collection("users")
            .add(user)
            .addOnSuccessListener(new OnSuccessListener<DocumentReference>() {
                @Override
                public void onSuccess(DocumentReference documentReference) {
                    Log.d(TAG, "DocumentSnapshot added with ID: " + documentReference.getId());
                }
            })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Log.w(TAG, "Error adding document", e);
                }
            });

    科特林+KTX

    // Create a new user with a first, middle, and last name
    val user = hashMapOf(
            "first" to "Alan",
            "middle" to "Mathison",
            "last" to "Turing",
            "born" to 1912
    )
    
    // Add a new document with a generated ID
    db.collection("users")
        .add(user)
        .addOnSuccessListener { documentReference ->
            Log.d(TAG, "DocumentSnapshot added with ID: ${documentReference.id}")
        }
        .addOnFailureListener { e ->
            Log.w(TAG, "Error adding document", e)
        }
    爪哇
    DocumentReference docRef = db.collection("users").document("aturing");
    // Add document data with an additional field ("middle")
    Map<String, Object> data = new HashMap<>();
    data.put("first", "Alan");
    data.put("middle", "Mathison");
    data.put("last", "Turing");
    data.put("born", 1912);
    
    ApiFuture<WriteResult> result = docRef.set(data);
    System.out.println("Update time : " + result.get().getUpdateTime());
    Python
    doc_ref = db.collection(u'users').document(u'aturing')
    doc_ref.set({
        u'first': u'Alan',
        u'middle': u'Mathison',
        u'last': u'Turing',
        u'born': 1912
    })
    C++
    db->Collection("users")
        .Add({{"first", FieldValue::String("Alan")},
              {"middle", FieldValue::String("Mathison")},
              {"last", FieldValue::String("Turing")},
              {"born", FieldValue::Integer(1912)}})
        .OnCompletion([](const Future<DocumentReference>& future) {
          if (future.error() == Error::kErrorOk) {
            std::cout << "DocumentSnapshot added with ID: "
                      << future.result()->id() << '\n';
          } else {
            std::cout << "Error adding document: " << future.error_message()
                      << '\n';
          }
        });
    節點.js
    const aTuringRef = db.collection('users').doc('aturing');
    
    await aTuringRef.set({
      'first': 'Alan',
      'middle': 'Mathison',
      'last': 'Turing',
      'born': 1912
    });
    _, _, err = client.Collection("users").Add(ctx, map[string]interface{}{
    	"first":  "Alan",
    	"middle": "Mathison",
    	"last":   "Turing",
    	"born":   1912,
    })
    if err != nil {
    	log.Fatalf("Failed adding aturing: %v", err)
    }
    PHP
    $docRef = $db->collection('samples/php/users')->document('aturing');
    $docRef->set([
        'first' => 'Alan',
        'middle' => 'Mathison',
        'last' => 'Turing',
        'born' => 1912
    ]);
    printf('Added data to the aturing document in the users collection.' . PHP_EOL);
    統一
    DocumentReference docRef = db.Collection("users").Document("aturing");
    Dictionary<string, object> user = new Dictionary<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.");
    });
    C#
    DocumentReference docRef = db.Collection("users").Document("aturing");
    Dictionary<string, object> user = new Dictionary<string, object>
    {
        { "First", "Alan" },
        { "Middle", "Mathison" },
        { "Last", "Turing" },
        { "Born", 1912 }
    };
    await docRef.SetAsync(user);
    紅寶石
    doc_ref = firestore.doc "#{collection_path}/aturing"
    
    doc_ref.set(
      {
        first:  "Alan",
        middle: "Mathison",
        last:   "Turing",
        born:   1912
      }
    )
    
    puts "Added data to the aturing document in the users collection."

    讀取數據

    要快速驗證您是否已將數據添加到 Cloud Firestore,請使用Firebase 控制台中的數據查看器。

    您還可以使用“get”方法來檢索整個集合。

    網頁版 v8

    db.collection("users").get().then((querySnapshot) => {
        querySnapshot.forEach((doc) => {
            console.log(`${doc.id} => ${doc.data()}`);
        });
    });

    網頁版 v9

    import { collection, getDocs } from "firebase/firestore"; 
    
    const querySnapshot = await getDocs(collection(db, "users"));
    querySnapshot.forEach((doc) => {
      console.log(`${doc.id} => ${doc.data()}`);
    });
    迅速
    db.collection("users").getDocuments() { (querySnapshot, err) in
        if let err = err {
            print("Error getting documents: \(err)")
        } else {
            for document in querySnapshot!.documents {
                print("\(document.documentID) => \(document.data())")
            }
        }
    }
    目標-C
    [[self.db collectionWithPath:@"users"]
        getDocumentsWithCompletion:^(FIRQuerySnapshot * _Nullable snapshot,
                                     NSError * _Nullable error) {
          if (error != nil) {
            NSLog(@"Error getting documents: %@", error);
          } else {
            for (FIRDocumentSnapshot *document in snapshot.documents) {
              NSLog(@"%@ => %@", document.documentID, document.data);
            }
          }
        }];

    爪哇

    db.collection("users")
            .get()
            .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                @Override
                public void onComplete(@NonNull Task<QuerySnapshot> task) {
                    if (task.isSuccessful()) {
                        for (QueryDocumentSnapshot document : task.getResult()) {
                            Log.d(TAG, document.getId() + " => " + document.getData());
                        }
                    } else {
                        Log.w(TAG, "Error getting documents.", task.getException());
                    }
                }
            });

    科特林+KTX

    db.collection("users")
            .get()
            .addOnSuccessListener { result ->
                for (document in result) {
                    Log.d(TAG, "${document.id} => ${document.data}")
                }
            }
            .addOnFailureListener { exception ->
                Log.w(TAG, "Error getting documents.", exception)
            }
    爪哇
    // asynchronously retrieve all users
    ApiFuture<QuerySnapshot> query = db.collection("users").get();
    // ...
    // query.get() blocks on response
    QuerySnapshot querySnapshot = query.get();
    List<QueryDocumentSnapshot> documents = querySnapshot.getDocuments();
    for (QueryDocumentSnapshot document : documents) {
      System.out.println("User: " + document.getId());
      System.out.println("First: " + document.getString("first"));
      if (document.contains("middle")) {
        System.out.println("Middle: " + document.getString("middle"));
      }
      System.out.println("Last: " + document.getString("last"));
      System.out.println("Born: " + document.getLong("born"));
    }
    Python
    users_ref = db.collection(u'users')
    docs = users_ref.stream()
    
    for doc in docs:
        print(f'{doc.id} => {doc.to_dict()}')
    C++
    Future<QuerySnapshot> users = db->Collection("users").Get();
    users.OnCompletion([](const Future<QuerySnapshot>& future) {
      if (future.error() == Error::kErrorOk) {
        for (const DocumentSnapshot& document : future.result()->documents()) {
          std::cout << document << '\n';
        }
      } else {
        std::cout << "Error getting documents: " << future.error_message()
                  << '\n';
      }
    });
    節點.js
    const snapshot = await db.collection('users').get();
    snapshot.forEach((doc) => {
      console.log(doc.id, '=>', doc.data());
    });
    iter := client.Collection("users").Documents(ctx)
    for {
    	doc, err := iter.Next()
    	if err == iterator.Done {
    		break
    	}
    	if err != nil {
    		log.Fatalf("Failed to iterate: %v", err)
    	}
    	fmt.Println(doc.Data())
    }
    PHP
    $usersRef = $db->collection('samples/php/users');
    $snapshot = $usersRef->documents();
    foreach ($snapshot as $user) {
        printf('User: %s' . PHP_EOL, $user->id());
        printf('First: %s' . PHP_EOL, $user['first']);
        if (!empty($user['middle'])) {
            printf('Middle: %s' . PHP_EOL, $user['middle']);
        }
        printf('Last: %s' . PHP_EOL, $user['last']);
        printf('Born: %d' . PHP_EOL, $user['born']);
        printf(PHP_EOL);
    }
    printf('Retrieved and printed out all documents from the users collection.' . PHP_EOL);
    統一
    CollectionReference usersRef = db.Collection("users");
    usersRef.GetSnapshotAsync().ContinueWithOnMainThread(task =>
    {
      QuerySnapshot snapshot = task.Result;
      foreach (DocumentSnapshot document in snapshot.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.");
    });
    C#
    CollectionReference usersRef = db.Collection("users");
    QuerySnapshot snapshot = await usersRef.GetSnapshotAsync();
    foreach (DocumentSnapshot document in snapshot.Documents)
    {
        Console.WriteLine("User: {0}", document.Id);
        Dictionary<string, object> documentDictionary = document.ToDictionary();
        Console.WriteLine("First: {0}", documentDictionary["First"]);
        if (documentDictionary.ContainsKey("Middle"))
        {
            Console.WriteLine("Middle: {0}", documentDictionary["Middle"]);
        }
        Console.WriteLine("Last: {0}", documentDictionary["Last"]);
        Console.WriteLine("Born: {0}", documentDictionary["Born"]);
        Console.WriteLine();
    }
    紅寶石
    users_ref = firestore.col collection_path
    users_ref.get do |user|
      puts "#{user.document_id} data: #{user.data}."
    end

    保護您的數據

    如果您使用的是 Web、Android 或 iOS SDK,請使用Firebase 身份驗證Cloud Firestore 安全規則來保護 Cloud Firestore 中的數據。

    以下是一些可用於入門的基本規則集。您可以在控制台的規則選項卡中修改您的安全規則。

    需要驗證

    // Allow read/write access on all documents to any user signed in to the application
    service cloud.firestore {
      match /databases/{database}/documents {
        match /{document=**} {
          allow read, write: if request.auth != null;
        }
      }
    }
    

    鎖定模式

    // Deny read/write access to all users under any conditions
    service cloud.firestore {
      match /databases/{database}/documents {
        match /{document=**} {
          allow read, write: if false;
        }
      }
    }
    

    測試模式

    // Allow read/write access to all users under any conditions
    // Warning: **NEVER** use this rule set in production; it allows
    // anyone to overwrite your entire database.
    service cloud.firestore {
      match /databases/{database}/documents {
        match /{document=**} {
          allow read, write: if true;
        }
      }
    }
    

    如果您使用服務器 SDK 之一,請使用身份和訪問管理 (IAM)來保護 Cloud Firestore 中的數據。

    觀看視頻教程

    有關開始使用 Cloud Firestore 移動和 Web 客戶端庫的詳細指南,請觀看以下視頻教程之一:

    網頁版 v8

    IOS
    安卓

    您可以在 Firebase YouTube 頻道 中找到更多視頻。

    下一步

    通過以下主題加深您的知識:

    • Codelabs - 按照適用於AndroidiOSWeb 的codelab學習在真實應用中使用 Cloud Firestore。
    • 數據模型- 詳細了解 Cloud Firestore 中的數據結構,包括分層數據和子集合。
    • 添加數據- 詳細了解如何在 Cloud Firestore 中創建和更新數據。
    • 獲取數據— 了解有關如何檢索數據的更多信息。
    • 執行簡單和復合查詢- 了解如何運行簡單和復合查詢。
    • 排序和限制查詢了解如何排序和限制查詢返回的數據。