Catch up on everthing we announced at this year's Firebase Summit. Learn more

開始使用 Cloud Firestore

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

創建 Cloud Firestore 數據庫

  1. 如果您尚未創建一個火力地堡項目:在火力地堡控制台,單擊添加項目,然後按照屏幕上的說明來創建一個火力地堡項目或火力地堡服務到現有的GCP項目添加。

  2. 導航到的雲計算公司的FireStore部分火力地堡控制台。系統會提示您選擇一個現有的 Firebase 項目。遵循數據庫創建工作流程。

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

    測試模式

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

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

    鎖定模式

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

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

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

    • 此位置設置項目的默認谷歌雲平台(GCP)資源位置。請注意,這個位置將在項目中需要的位置設置,具體而言,默認用於GCP服務雲存儲桶和您的App Engine應用程序(如果你使用雲調度器是必需的)。

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

  5. 點擊完成

當您啟用雲公司的FireStore,它還能夠在API的雲API經理

設置您的開發環境

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

網頁版 8

  1. 按照說明火力地堡添加到您的Web應用程序
  2. 添加火力地堡和雲公司的FireStore庫與您的應用程序:
    <script src="https://www.gstatic.com/firebasejs/8.10.0/firebase-app.js"></script>
    <script src="https://www.gstatic.com/firebasejs/8.10.0/firebase-firestore.js"></script>
    雲公司的FireStore SDK也可作為一個NPM包。
    npm install firebase@8.10.0 --save
    
    您需要手動既需要火力地堡和雲公司的FireStore。
    const firebase = require("firebase");
    // Required for side-effects
    require("firebase/firestore");
    

網頁版 9

  1. 按照說明火力地堡添加到您的Web應用程序
  2. Cloud Firestore SDK 以 npm 包的形式提供。
    npm install firebase@9.4.1 --save
    
    ,您需要同時導入火力地堡和雲公司的FireStore。
    import { initializeApp } from "firebase/app";
    import { getFirestore } from "firebase/firestore";
    
iOS+
  1. 按照說明火力地堡添加到您的蘋果應用程序
  2. 雲莢的FireStore添加到您的Podfile
    pod 'Firebase/Firestore'
    
    # Optionally, include the Swift extensions if you're using Swift.
    pod 'FirebaseFirestoreSwift'
    
  3. 保存文件並運行pod install

爪哇

  1. 按照說明火力地堡添加到您的Android應用
  2. 使用火力地堡Android的物料清單,聲明你的模塊(應用程序級)搖籃文件(通常為雲公司的FireStore的Android庫的依賴app/build.gradle )。
    dependencies {
        // Import the BoM for the Firebase platform
        implementation platform('com.google.firebase:firebase-bom:29.0.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'
    }
    

    通過使用火力地堡Android的物料清單,您的應用程序將始終使用火力地堡的Android庫的兼容版本。

    (替代)聲明火力地堡庫依賴使用物料清單

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

    需要注意的是,如果你在你的應用程序使用多個火力地堡庫,我們強烈建議您使用的物料清單管理庫版本,以保證所有版本相互兼容。

    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:24.0.0'
    }
    

科特林+KTX

  1. 按照說明火力地堡添加到您的Android應用
  2. 使用火力地堡Android的物料清單,聲明你的模塊(應用程序級)搖籃文件(通常為雲公司的FireStore的Android庫的依賴app/build.gradle )。
    dependencies {
        // Import the BoM for the Firebase platform
        implementation platform('com.google.firebase:firebase-bom:29.0.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'
    }
    

    通過使用火力地堡Android的物料清單,您的應用程序將始終使用火力地堡的Android庫的兼容版本。

    (替代)聲明火力地堡庫依賴使用物料清單

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

    需要注意的是,如果你在你的應用程序使用多個火力地堡庫,我們強烈建議您使用的物料清單管理庫版本,以保證所有版本相互兼容。

    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:24.0.0'
    }
    
爪哇
  1. 將 Firebase Admin SDK 添加到您的應用:
    • 使用搖籃:
      compile 'com.google.firebase:firebase-admin:8.1.0'
      
    • 使用Maven:
      <dependency>
        <groupId>com.google.firebase</groupId>
        <artifactId>firebase-admin</artifactId>
        <version>8.1.0</version>
      </dependency>
           
  2. 按照以下說明在您的環境中使用正確的憑據初始化 Cloud Firestore。
Python
  1. 添加火力地堡管理SDK到您的Python應用程序:
    pip install --upgrade firebase-admin
  2. 按照以下說明在您的環境中使用正確的憑據初始化 Cloud Firestore。
C++
  1. 按照說明火力地堡添加到您的C ++項目
  2. 適用於 Android 的 C++ 接口。
    • 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. 要設置桌面集成,請參閱添加火力地堡到C ++項目
統一
  1. 按照說明火力地堡添加到您的統一項目
  2. Android 的 Unity 界面。
  3. 在為 Android 構建時,啟用 ProGuarding 以避免 Android DEX 限制。為此,請在 Unity 編輯器中:

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

詳細涉及雲計算公司的FireStore和雲功能演練是可用的。你也應該看看的地方模擬器套件介紹

初始化 Cloud Firestore

初始化 Cloud Firestore 的一個實例:

網頁版 9

// 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`的值可以在你的web應用程序的發現`firebaseConfig` 。要保留數據,當設備的連接丟失,請參閱啟用脫機數據文件。

網頁版 8

// 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`的值可以在你的web應用程序的發現`firebaseConfig` 。要保留數據,當設備的連接丟失,請參閱啟用脫機數據文件。
迅速
注:本產品不提供watchOS和App剪輯目標。
import Firebase
FirebaseApp.configure()

let db = Firestore.firestore()
目標-C
注:本產品不提供watchOS和App剪輯目標。
@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 根據您的環境以不同方式初始化。以下是最常用的方法。對於一個完整的參考,請參閱初始化管理SDK
  • 初始化在谷歌雲平台
    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();
    
  • 在你自己的服務器上初始化

    要使用火力地堡管理SDK自己的服務器上,使用服務帳戶

    轉到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 根據您的環境以不同方式初始化。下面是最常用的方法。對於一個完整的參考,請參閱初始化管理SDK
  • 初始化在谷歌雲平台
    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()
    
  • 在你自己的服務器上初始化

    要使用火力地堡管理SDK自己的服務器上,使用服務帳戶

    轉到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()
    
  • Python

    Cloud Firestore SDK 根據您的環境以不同方式初始化。以下是最常用的方法。對於一個完整的參考,請參閱初始化管理SDK
  • 初始化在谷歌雲平台
    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.AsyncClient()
    
  • 在你自己的服務器上初始化

    要使用火力地堡管理SDK自己的服務器上,使用服務帳戶

    轉到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.AsyncClient()
    
  • 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 根據您的環境以不同方式初始化。下面是最常用的方法。對於一個完整的參考,請參閱初始化管理SDK
    • 雲功能初始化
      const { initializeApp, applicationDefault, cert } = require('firebase-admin/app');
      const { getFirestore, Timestamp, FieldValue } = require('firebase-admin/firestore');
      initializeApp();
      
      const db = getFirestore();
      
    • 初始化在谷歌雲平台
      const { initializeApp, applicationDefault, cert } = require('firebase-admin/app');
      const { getFirestore, Timestamp, FieldValue } = require('firebase-admin/firestore');
      initializeApp({
        credential: applicationDefault()
      });
      
      const db = getFirestore();
    • 在你自己的服務器上初始化

      要使用自己的服務器上管理員火力地堡的SDK(或任何其他的Node.js環境),使用服務帳戶。轉到IAM與管理>服務帳戶在雲平台上控制台。生成新的私鑰並保存 JSON 文件。然後使用該文件初始化SDK:

      const { initializeApp, applicationDefault, cert } = require('firebase-admin/app');
      const { getFirestore, Timestamp, FieldValue } = require('firebase-admin/firestore');
      const serviceAccount = require('./path/to/serviceAccountKey.json');
      
      initializeApp({
        credential: cert(serviceAccount)
      });
      
      const db = getFirestore();
      
    Cloud Firestore SDK 根據您的環境以不同方式初始化。下面是最常用的方法。對於一個完整的參考,請參閱初始化管理SDK
  • 初始化在谷歌雲平台
    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()
    
  • 在你自己的服務器上初始化

    要使用火力地堡管理SDK自己的服務器上,使用服務帳戶

    轉到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.
     */
    function setup_client_create(string $projectId = null)
    {
        // Create the Cloud Firestore client
        if (empty($projectId)) {
            // The `projectId` parameter is optional and represents which project the
            // client will act on behalf of. If not supplied, the client falls back to
            // the default project inferred from the environment.
            $db = new FirestoreClient();
            printf('Created Cloud Firestore client with default project ID.' . PHP_EOL);
        } else {
            $db = new FirestoreClient([
                'projectId' => $projectId,
            ]);
            printf('Created Cloud Firestore client with project ID: %s' . PHP_EOL, $projectId);
        }
    }
    統一
    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"
    
    # The `project_id` parameter is optional and represents which project the
    # client will act on behalf of. If not supplied, the client falls back to the
    # default project inferred from the environment.
    firestore = Google::Cloud::Firestore.new project_id: project_id
    
    puts "Created Cloud Firestore client with given project ID."

    添加數據

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

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

    網頁版 9

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

    網頁版 8

    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);
    });
    迅速
    注:本產品不提供watchOS和App剪輯目標。
    // 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
    注:本產品不提供watchOS和App剪輯目標。
    // 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
    })

    Python

    doc_ref = db.collection("users").document("alovelace")
    await doc_ref.set({"first": "Ada", "last": "Lovelace", "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()
                  << std::endl;
      } else {
        std::cout << "Error adding document: " << future.error_message() << std::endl;
      }
    });
    節點.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集合。請注意,此文檔包含未出現在第一個文檔中的鍵值對(中間名)。集合中的文檔可以包含不同的信息集。

    網頁版 9

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

    網頁版 8

    // 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);
    });
    迅速
    注:本產品不提供watchOS和App剪輯目標。
    // 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
    注:本產品不提供watchOS和App剪輯目標。
    // 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
    })

    Python

    doc_ref = db.collection("users").document("aturing")
    await doc_ref.set(
        {"first": "Alan", "middle": "Mathison", "last": "Turing", "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() << std::endl;
          } else {
            std::cout << "Error adding document: " << future.error_message()
                      << std::endl;
          }
        });
    節點.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."

    讀取數據

    要快速確認您已經添加數據到雲公司的FireStore,在使用數據觀眾火力地堡控制台

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

    網頁版 9

    import { collection, getDocs } from "firebase/firestore"; 
    
    const querySnapshot = await getDocs(collection(db, "users"));
    querySnapshot.forEach((doc) => {
      console.log(`${doc.id} => ${doc.data()}`);
    });

    網頁版 8

    db.collection("users").get().then((querySnapshot) => {
        querySnapshot.forEach((doc) => {
            console.log(`${doc.id} => ${doc.data()}`);
        });
    });
    迅速
    注:本產品不提供watchOS和App剪輯目標。
    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
    注:本產品不提供watchOS和App剪輯目標。
    [[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()}')

    Python

    users_ref = db.collection("users")
    docs = users_ref.stream()
    
    async 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 << std::endl;
        }
      } else {
        std::cout << "Error getting documents: " << future.error_message()
                  << std::endl;
      }
    });
    節點.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或蘋果平台的SDK,使用火力地堡認證雲公司的FireStore安全規則在雲公司的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;
        }
      }
    }
    

    在將 Web、Android 或 iOS 應用部署到生產環境之前,還應採取措施確保只有您的應用客戶端才能訪問您的 Cloud Firestore 數據。查看應用來查看文檔。

    如果您正在使用的服務器的SDK的一個,利用身份和訪問管理(IAM) ,以確保在雲公司的FireStore您的數據。

    觀看視頻教程

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

    網絡
    iOS+
    安卓

    你可以找到在火力地堡更多視頻的YouTube頻道

    下一步

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