Thêm dữ liệu vào Cloud Firestore

Tài liệu này giải thích cách thiết lập, thêm hoặc cập nhật từng tài liệu trong Cloud Firestore. Để ghi dữ liệu hàng loạt, hãy xem bài viết Giao dịch và ghi hàng loạt.

Tổng quan

Bạn có thể ghi dữ liệu vào Cloud Firestore theo một trong những cách sau:

  • Thiết lập dữ liệu của một tài liệu trong một bộ sưu tập, chỉ định rõ ràng giá trị nhận dạng tài liệu.
  • Thêm tài liệu mới vào một bộ sưu tập. Trong trường hợp này, Cloud Firestore sẽ tự động tạo giá trị nhận dạng tài liệu.
  • Tạo một tài liệu trống có giá trị nhận dạng được tạo tự động, rồi gán dữ liệu cho tài liệu đó sau.

Trước khi bắt đầu

Để có thể khởi chạy Cloud Firestore nhằm đặt, thêm hoặc cập nhật dữ liệu, bạn phải hoàn tất các bước sau:

Khởi động Cloud Firestore

Khởi động một thực thể của Cloud Firestore:

Web

import { initializeApp } from "firebase/app";
import { getFirestore } from "firebase/firestore";

// TODO: Replace the following with your app's Firebase project configuration
// See: https://support.google.com/firebase/answer/7015592
const firebaseConfig = {
    FIREBASE_CONFIGURATION
};

// Initialize Firebase
const app = initializeApp(firebaseConfig);


// Initialize Cloud Firestore and get a reference to the service
const db = getFirestore(app);

Thay thế FIREBASE_CONFIGURATION bằng firebaseConfig của ứng dụng web.

Để lưu giữ dữ liệu khi thiết bị mất kết nối, hãy xem tài liệu Bật dữ liệu ngoại tuyến.

Web

import firebase from "firebase/app";
import "firebase/firestore";

// TODO: Replace the following with your app's Firebase project configuration
// See: https://support.google.com/firebase/answer/7015592
const firebaseConfig = {
    FIREBASE_CONFIGURATION
};

// Initialize Firebase
firebase.initializeApp(firebaseConfig);


// Initialize Cloud Firestore and get a reference to the service
const db = firebase.firestore();

Thay thế FIREBASE_CONFIGURATION bằng firebaseConfig của ứng dụng web.

Để lưu giữ dữ liệu khi thiết bị mất kết nối, hãy xem tài liệu Bật dữ liệu ngoại tuyến.

Swift
Lưu ý: Sản phẩm này không dùng được trên các mục tiêu watchOS và App Clip.
import FirebaseCore
import FirebaseFirestore
FirebaseApp.configure()

let db = Firestore.firestore()
Objective-C
Lưu ý: Sản phẩm này không dùng được trên các mục tiêu watchOS và App Clip.
@import FirebaseCore;
@import FirebaseFirestore;

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

Kotlin+KTX

// Access a Cloud Firestore instance from your Activity
val db = Firebase.firestore

Java

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

Dart

db = FirebaseFirestore.instance;
Java
SDK Cloud Firestore được khởi chạy theo nhiều cách tuỳ thuộc vào môi trường của bạn. Dưới đây là các phương thức phổ biến nhất. Để tham khảo đầy đủ, hãy xem phần Khởi chạy SDK quản trị.
  • Khởi chạy trên Google Cloud
    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();
  • Khởi chạy trên máy chủ của riêng bạn

    Để dùng SDK Quản trị của Firebase trên máy chủ của riêng bạn, hãy dùng một tài khoản dịch vụ.

    Chuyển đến phần IAM và quản trị viên > Tài khoản dịch vụ trong bảng điều khiển Google Cloud. Tạo một khoá riêng tư mới và lưu tệp JSON. Sau đó, hãy sử dụng tệp này để khởi chạy 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
    SDK Cloud Firestore được khởi chạy theo nhiều cách tuỳ thuộc vào môi trường của bạn. Dưới đây là những phương pháp phổ biến nhất. Để tham khảo đầy đủ, hãy xem phần Khởi chạy SDK dành cho quản trị viên.
  • Khởi chạy trên Google Cloud
    import firebase_admin
    from firebase_admin import firestore
    
    # Application Default credentials are automatically created.
    app = firebase_admin.initialize_app()
    db = firestore.client()

    Thông tin xác thực mặc định của ứng dụng hiện có cũng có thể được sử dụng để khởi chạy 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)
    db = firestore.client()
  • Khởi chạy trên máy chủ của riêng bạn

    Để dùng SDK Quản trị của Firebase trên máy chủ của riêng bạn, hãy dùng một tài khoản dịch vụ.

    Chuyển đến phần IAM và quản trị > Tài khoản dịch vụ trong bảng điều khiển Google Cloud. Tạo một khoá riêng tư mới và lưu tệp JSON. Sau đó, hãy sử dụng tệp này để khởi chạy 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')
    
    app = firebase_admin.initialize_app(cred)
    
    db = firestore.client()
  • Python

    SDK Cloud Firestore được khởi chạy theo nhiều cách tuỳ thuộc vào môi trường của bạn. Dưới đây là những phương pháp phổ biến nhất. Để tham khảo đầy đủ, hãy xem phần Khởi chạy SDK quản trị.
  • Khởi chạy trên Google Cloud
    import firebase_admin
    from firebase_admin import firestore_async
    
    # Application Default credentials are automatically created.
    app = firebase_admin.initialize_app()
    db = firestore_async.client()

    Thông tin xác thực mặc định của ứng dụng hiện có cũng có thể được sử dụng để khởi chạy SDK.

    import firebase_admin
    from firebase_admin import credentials
    from firebase_admin import firestore_async
    
    # Use the application default credentials.
    cred = credentials.ApplicationDefault()
    
    firebase_admin.initialize_app(cred)
    db = firestore_async.client()
  • Khởi chạy trên máy chủ của riêng bạn

    Để sử dụng SDK quản trị Firebase trên máy chủ của riêng bạn, hãy sử dụng tài khoản dịch vụ.

    Chuyển đến phần IAM và quản trị viên > Tài khoản dịch vụ trong bảng điều khiển Google Cloud. Tạo một khoá riêng tư mới và lưu tệp JSON. Sau đó, sử dụng tệp này để khởi chạy SDK:

    import firebase_admin
    from firebase_admin import credentials
    from firebase_admin import firestore_async
    
    # Use a service account.
    cred = credentials.Certificate('path/to/serviceAccount.json')
    
    app = firebase_admin.initialize_app(cred)
    
    db = firestore_async.client()
  • C++
    // Make sure the call to `Create()` happens some time before you call Firestore::GetInstance().
    App::Create();
    Firestore* db = Firestore::GetInstance();
    Node.js
    SDK Cloud Firestore được khởi chạy theo nhiều cách tuỳ thuộc vào môi trường của bạn. Dưới đây là các phương thức phổ biến nhất. Để tham khảo đầy đủ, hãy xem phần Khởi chạy SDK quản trị.
    • Khởi chạy trên Cloud Functions
      const { initializeApp, applicationDefault, cert } = require('firebase-admin/app');
      const { getFirestore, Timestamp, FieldValue, Filter } = require('firebase-admin/firestore');
      initializeApp();
      
      const db = getFirestore();
      
    • Khởi chạy trên Google Cloud
      const { initializeApp, applicationDefault, cert } = require('firebase-admin/app');
      const { getFirestore, Timestamp, FieldValue, Filter } = require('firebase-admin/firestore');
      initializeApp({
        credential: applicationDefault()
      });
      
      const db = getFirestore();
    • Khởi chạy trên máy chủ của riêng bạn

      Để sử dụng SDK Quản trị Firebase trên máy chủ của riêng bạn (hoặc bất kỳ môi trường Node.js nào khác), hãy sử dụng tài khoản dịch vụ. Chuyển đến phần IAM và quản trị viên > Tài khoản dịch vụ trong bảng điều khiển Google Cloud. Tạo một khoá riêng tư mới và lưu tệp JSON. Sau đó, hãy sử dụng tệp này để khởi chạy SDK:

      const { initializeApp, applicationDefault, cert } = require('firebase-admin/app');
      const { getFirestore, Timestamp, FieldValue, Filter } = require('firebase-admin/firestore');
      const serviceAccount = require('./path/to/serviceAccountKey.json');
      
      initializeApp({
        credential: cert(serviceAccount)
      });
      
      const db = getFirestore();
      
    Tiến hành
    SDK Cloud Firestore được khởi chạy theo nhiều cách tuỳ thuộc vào môi trường của bạn. Dưới đây là các phương thức phổ biến nhất. Để tham khảo đầy đủ, hãy xem phần Khởi chạy SDK quản trị.
  • Khởi chạy trên Google Cloud
    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()
  • Khởi chạy trên máy chủ của riêng bạn

    Để sử dụng SDK quản trị Firebase trên máy chủ của riêng bạn, hãy sử dụng tài khoản dịch vụ.

    Chuyển đến phần IAM và quản trị > Tài khoản dịch vụ trong bảng điều khiển Google Cloud. Tạo một khoá riêng tư mới và lưu tệp JSON. Sau đó, hãy sử dụng tệp này để khởi chạy 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

    PHP

    Để biết thêm thông tin về cách cài đặt và tạo ứng dụng Cloud Firestore, hãy tham khảo Thư viện ứng dụng Cloud Firestore.

    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);
        }
    }
    Unity
    using Firebase.Firestore;
    using Firebase.Extensions;
    FirebaseFirestore db = FirebaseFirestore.DefaultInstance;
    C#

    C#

    Để biết thêm thông tin về cách cài đặt và tạo ứng dụng Cloud Firestore, hãy tham khảo Thư viện ứng dụng Cloud Firestore.

    FirestoreDb db = FirestoreDb.Create(project);
    Console.WriteLine("Created Cloud Firestore client with project ID: {0}", project);
    Ruby
    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."

    Đặt tài liệu

    Để tạo hoặc ghi đè một tài liệu, hãy sử dụng các phương thức set() dành riêng cho ngôn ngữ sau:

    Web

    Sử dụng phương thức setDoc():

    import { doc, setDoc } from "firebase/firestore"; 
    
    // Add a new document in collection "cities"
    await setDoc(doc(db, "cities", "LA"), {
      name: "Los Angeles",
      state: "CA",
      country: "USA"
    });

    Web

    Sử dụng phương thức set():

    // Add a new document in collection "cities"
    db.collection("cities").doc("LA").set({
        name: "Los Angeles",
        state: "CA",
        country: "USA"
    })
    .then(() => {
        console.log("Document successfully written!");
    })
    .catch((error) => {
        console.error("Error writing document: ", error);
    });
    Swift

    Sử dụng phương thức setData():

    Lưu ý: Sản phẩm này không dùng được trên các mục tiêu watchOS và App Clip.
    // Add a new document in collection "cities"
    do {
      try await db.collection("cities").document("LA").setData([
        "name": "Los Angeles",
        "state": "CA",
        "country": "USA"
      ])
      print("Document successfully written!")
    } catch {
      print("Error writing document: \(error)")
    }
    Objective-C

    Sử dụng phương thức setData::

    Lưu ý: Sản phẩm này không dùng được trên các mục tiêu watchOS và App Clip.
    // Add a new document in collection "cities"
    [[[self.db collectionWithPath:@"cities"] documentWithPath:@"LA"] setData:@{
      @"name": @"Los Angeles",
      @"state": @"CA",
      @"country": @"USA"
    } completion:^(NSError * _Nullable error) {
      if (error != nil) {
        NSLog(@"Error writing document: %@", error);
      } else {
        NSLog(@"Document successfully written!");
      }
    }];

    Kotlin+KTX

    Sử dụng phương thức set():

    val city = hashMapOf(
        "name" to "Los Angeles",
        "state" to "CA",
        "country" to "USA",
    )
    
    db.collection("cities").document("LA")
        .set(city)
        .addOnSuccessListener { Log.d(TAG, "DocumentSnapshot successfully written!") }
        .addOnFailureListener { e -> Log.w(TAG, "Error writing document", e) }

    Java

    Sử dụng phương thức set():

    Map<String, Object> city = new HashMap<>();
    city.put("name", "Los Angeles");
    city.put("state", "CA");
    city.put("country", "USA");
    
    db.collection("cities").document("LA")
            .set(city)
            .addOnSuccessListener(new OnSuccessListener<Void>() {
                @Override
                public void onSuccess(Void aVoid) {
                    Log.d(TAG, "DocumentSnapshot successfully written!");
                }
            })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Log.w(TAG, "Error writing document", e);
                }
            });

    Dart

    Sử dụng phương thức set():

    final city = <String, String>{
      "name": "Los Angeles",
      "state": "CA",
      "country": "USA"
    };
    
    db
        .collection("cities")
        .doc("LA")
        .set(city)
        .onError((e, _) => print("Error writing document: $e"));
    Java

    Sử dụng phương thức set():

    // Create a Map to store the data we want to set
    Map<String, Object> docData = new HashMap<>();
    docData.put("name", "Los Angeles");
    docData.put("state", "CA");
    docData.put("country", "USA");
    docData.put("regions", Arrays.asList("west_coast", "socal"));
    // Add a new document (asynchronously) in collection "cities" with id "LA"
    ApiFuture<WriteResult> future = db.collection("cities").document("LA").set(docData);
    // ...
    // future.get() blocks on response
    System.out.println("Update time : " + future.get().getUpdateTime());
    Python

    Sử dụng phương thức set():

    data = {"name": "Los Angeles", "state": "CA", "country": "USA"}
    
    # Add a new doc in collection 'cities' with ID 'LA'
    db.collection("cities").document("LA").set(data)

    Python

    Sử dụng phương thức set():

    data = {"name": "Los Angeles", "state": "CA", "country": "USA"}
    
    # Add a new doc in collection 'cities' with ID 'LA'
    await db.collection("cities").document("LA").set(data)
    C++

    Sử dụng phương thức Set():

    // Add a new document in collection 'cities'
    db->Collection("cities")
        .Document("LA")
        .Set({{"name", FieldValue::String("Los Angeles")},
              {"state", FieldValue::String("CA")},
              {"country", FieldValue::String("USA")}})
        .OnCompletion([](const Future<void>& future) {
          if (future.error() == Error::kErrorOk) {
            std::cout << "DocumentSnapshot successfully written!" << std::endl;
          } else {
            std::cout << "Error writing document: " << future.error_message()
                      << std::endl;
          }
        });
    Node.js

    Sử dụng phương thức set():

    const data = {
      name: 'Los Angeles',
      state: 'CA',
      country: 'USA'
    };
    
    // Add a new document in collection "cities" with ID 'LA'
    const res = await db.collection('cities').doc('LA').set(data);
    Tiến hành

    Sử dụng phương thức Set():

    
    import (
    	"context"
    	"log"
    
    	"cloud.google.com/go/firestore"
    )
    
    func addDocAsMap(ctx context.Context, client *firestore.Client) error {
    	_, err := client.Collection("cities").Doc("LA").Set(ctx, map[string]interface{}{
    		"name":    "Los Angeles",
    		"state":   "CA",
    		"country": "USA",
    	})
    	if err != nil {
    		// Handle any errors in an appropriate way, such as returning them.
    		log.Printf("An error has occurred: %s", err)
    	}
    
    	return err
    }
    
    PHP

    Sử dụng phương thức set():

    PHP

    Để biết thêm thông tin về cách cài đặt và tạo ứng dụng Cloud Firestore, hãy tham khảo Thư viện ứng dụng Cloud Firestore.

    $data = [
        'name' => 'Los Angeles',
        'state' => 'CA',
        'country' => 'USA'
    ];
    $db->collection('samples/php/cities')->document('LA')->set($data);
    Unity

    Sử dụng phương thức SetAsync():

    DocumentReference docRef = db.Collection("cities").Document("LA");
    Dictionary<string, object> city = new Dictionary<string, object>
    {
    	{ "Name", "Los Angeles" },
    	{ "State", "CA" },
    	{ "Country", "USA" }
    };
    docRef.SetAsync(city).ContinueWithOnMainThread(task => {
    	Debug.Log("Added data to the LA document in the cities collection.");
    });
    C#

    Sử dụng phương thức SetAsync():

    DocumentReference docRef = db.Collection("cities").Document("LA");
    Dictionary<string, object> city = new Dictionary<string, object>
    {
        { "name", "Los Angeles" },
        { "state", "CA" },
        { "country", "USA" }
    };
    await docRef.SetAsync(city);
    Ruby

    Sử dụng phương thức set():

    city_ref = firestore.doc "#{collection_path}/LA"
    
    data = {
      name:    "Los Angeles",
      state:   "CA",
      country: "USA"
    }
    
    city_ref.set data

    Nếu không tồn tại tài liệu, tài liệu sẽ được tạo. Nếu tài liệu tồn tại, nội dung của tài liệu đó sẽ bị ghi đè bằng dữ liệu mới cung cấp, trừ phi bạn chỉ định dữ liệu sẽ được hợp nhất vào tài liệu hiện có như sau:

    Web

    import { doc, setDoc } from "firebase/firestore"; 
    
    const cityRef = doc(db, 'cities', 'BJ');
    setDoc(cityRef, { capital: true }, { merge: true });

    Web

    var cityRef = db.collection('cities').doc('BJ');
    
    var setWithMerge = cityRef.set({
        capital: true
    }, { merge: true });
    Swift
    Lưu ý: Sản phẩm này không dùng được trên các mục tiêu watchOS và App Clip.
    // Update one field, creating the document if it does not exist.
    db.collection("cities").document("BJ").setData([ "capital": true ], merge: true)
    Objective-C
    Lưu ý: Sản phẩm này không dùng được trên các mục tiêu watchOS và App Clip.
    // Write to the document reference, merging data with existing
    // if the document already exists
    [[[self.db collectionWithPath:@"cities"] documentWithPath:@"BJ"]
         setData:@{ @"capital": @YES }
         merge:YES
         completion:^(NSError * _Nullable error) {
           // ...
         }];

    Kotlin+KTX

    // Update one field, creating the document if it does not already exist.
    val data = hashMapOf("capital" to true)
    
    db.collection("cities").document("BJ")
        .set(data, SetOptions.merge())

    Java

    // Update one field, creating the document if it does not already exist.
    Map<String, Object> data = new HashMap<>();
    data.put("capital", true);
    
    db.collection("cities").document("BJ")
            .set(data, SetOptions.merge());

    Dart

    // Update one field, creating the document if it does not already exist.
    final data = {"capital": true};
    
    db.collection("cities").doc("BJ").set(data, SetOptions(merge: true));
    Java
    // asynchronously update doc, create the document if missing
    Map<String, Object> update = new HashMap<>();
    update.put("capital", true);
    
    ApiFuture<WriteResult> writeResult =
        db.collection("cities").document("BJ").set(update, SetOptions.merge());
    // ...
    System.out.println("Update time : " + writeResult.get().getUpdateTime());
    Python
    city_ref = db.collection("cities").document("BJ")
    
    city_ref.set({"capital": True}, merge=True)

    Python

    city_ref = db.collection("cities").document("BJ")
    
    await city_ref.set({"capital": True}, merge=True)
    C++
    db->Collection("cities").Document("BJ").Set(
        {{"capital", FieldValue::Boolean(true)}}, SetOptions::Merge());
    Node.js
    const cityRef = db.collection('cities').doc('BJ');
    
    const res = await cityRef.set({
      capital: true
    }, { merge: true });
    Tiến hành
    
    import (
    	"context"
    	"log"
    
    	"cloud.google.com/go/firestore"
    )
    
    func updateDocCreateIfMissing(ctx context.Context, client *firestore.Client) error {
    	_, err := client.Collection("cities").Doc("BJ").Set(ctx, map[string]interface{}{
    		"capital": true,
    	}, firestore.MergeAll)
    
    	if err != nil {
    		// Handle any errors in an appropriate way, such as returning them.
    		log.Printf("An error has occurred: %s", err)
    	}
    
    	return err
    }
    
    PHP

    PHP

    Để biết thêm thông tin về cách cài đặt và tạo ứng dụng Cloud Firestore, hãy tham khảo Thư viện ứng dụng Cloud Firestore.

    $cityRef = $db->collection('samples/php/cities')->document('BJ');
    $cityRef->set([
        'capital' => true
    ], ['merge' => true]);
    Unity
    DocumentReference docRef = db.Collection("cities").Document("LA");
    Dictionary<string, object> update = new Dictionary<string, object>
    {
    	{ "capital", false }
    };
    docRef.SetAsync(update, SetOptions.MergeAll);
    C#
    DocumentReference docRef = db.Collection("cities").Document("LA");
    Dictionary<string, object> update = new Dictionary<string, object>
    {
        { "capital", false }
    };
    await docRef.SetAsync(update, SetOptions.MergeAll);
    Ruby
    city_ref = firestore.doc "#{collection_path}/LA"
    city_ref.set({ capital: false }, merge: true)

    Nếu bạn không chắc liệu tài liệu có tồn tại hay không, hãy chuyển tuỳ chọn hợp nhất dữ liệu mới với bất kỳ tài liệu hiện có nào để tránh ghi đè toàn bộ tài liệu. Đối với các tài liệu chứa bản đồ, nếu bạn chỉ định một tập hợp có trường chứa bản đồ trống, thì trường bản đồ của tài liệu đích sẽ bị ghi đè.

    Loại dữ liệu

    Cloud Firestore cho phép bạn ghi nhiều loại dữ liệu bên trong một tài liệu, bao gồm chuỗi, boolean, số, ngày, giá trị rỗng, mảng lồng nhau và đối tượng. Cloud Firestore luôn lưu trữ số dưới dạng số thực, bất kể bạn sử dụng loại số nào trong mã.

    Web

    import { doc, setDoc, Timestamp } from "firebase/firestore"; 
    
    const docData = {
        stringExample: "Hello world!",
        booleanExample: true,
        numberExample: 3.14159265,
        dateExample: Timestamp.fromDate(new Date("December 10, 1815")),
        arrayExample: [5, true, "hello"],
        nullExample: null,
        objectExample: {
            a: 5,
            b: {
                nested: "foo"
            }
        }
    };
    await setDoc(doc(db, "data", "one"), docData);

    Web

    var docData = {
        stringExample: "Hello world!",
        booleanExample: true,
        numberExample: 3.14159265,
        dateExample: firebase.firestore.Timestamp.fromDate(new Date("December 10, 1815")),
        arrayExample: [5, true, "hello"],
        nullExample: null,
        objectExample: {
            a: 5,
            b: {
                nested: "foo"
            }
        }
    };
    db.collection("data").doc("one").set(docData).then(() => {
        console.log("Document successfully written!");
    });
    Swift
    Lưu ý: Sản phẩm này không dùng được trên các mục tiêu watchOS và App Clip.
    let docData: [String: Any] = [
      "stringExample": "Hello world!",
      "booleanExample": true,
      "numberExample": 3.14159265,
      "dateExample": Timestamp(date: Date()),
      "arrayExample": [5, true, "hello"],
      "nullExample": NSNull(),
      "objectExample": [
        "a": 5,
        "b": [
          "nested": "foo"
        ]
      ]
    ]
    do {
      try await db.collection("data").document("one").setData(docData)
      print("Document successfully written!")
    } catch {
      print("Error writing document: \(error)")
    }
    Objective-C
    Lưu ý: Sản phẩm này không dùng được trên các mục tiêu watchOS và App Clip.
    NSDictionary *docData = @{
      @"stringExample": @"Hello world!",
      @"booleanExample": @YES,
      @"numberExample": @3.14,
      @"dateExample": [FIRTimestamp timestampWithDate:[NSDate date]],
      @"arrayExample": @[@5, @YES, @"hello"],
      @"nullExample": [NSNull null],
      @"objectExample": @{
        @"a": @5,
        @"b": @{
          @"nested": @"foo"
        }
      }
    };
    
    [[[self.db collectionWithPath:@"data"] documentWithPath:@"one"] setData:docData
        completion:^(NSError * _Nullable error) {
          if (error != nil) {
            NSLog(@"Error writing document: %@", error);
          } else {
            NSLog(@"Document successfully written!");
          }
        }];

    Kotlin+KTX

    val docData = hashMapOf(
        "stringExample" to "Hello world!",
        "booleanExample" to true,
        "numberExample" to 3.14159265,
        "dateExample" to Timestamp(Date()),
        "listExample" to arrayListOf(1, 2, 3),
        "nullExample" to null,
    )
    
    val nestedData = hashMapOf(
        "a" to 5,
        "b" to true,
    )
    
    docData["objectExample"] = nestedData
    
    db.collection("data").document("one")
        .set(docData)
        .addOnSuccessListener { Log.d(TAG, "DocumentSnapshot successfully written!") }
        .addOnFailureListener { e -> Log.w(TAG, "Error writing document", e) }

    Java

    Map<String, Object> docData = new HashMap<>();
    docData.put("stringExample", "Hello world!");
    docData.put("booleanExample", true);
    docData.put("numberExample", 3.14159265);
    docData.put("dateExample", new Timestamp(new Date()));
    docData.put("listExample", Arrays.asList(1, 2, 3));
    docData.put("nullExample", null);
    
    Map<String, Object> nestedData = new HashMap<>();
    nestedData.put("a", 5);
    nestedData.put("b", true);
    
    docData.put("objectExample", nestedData);
    
    db.collection("data").document("one")
            .set(docData)
            .addOnSuccessListener(new OnSuccessListener<Void>() {
                @Override
                public void onSuccess(Void aVoid) {
                    Log.d(TAG, "DocumentSnapshot successfully written!");
                }
            })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Log.w(TAG, "Error writing document", e);
                }
            });

    Dart

    final docData = {
      "stringExample": "Hello world!",
      "booleanExample": true,
      "numberExample": 3.14159265,
      "dateExample": Timestamp.now(),
      "listExample": [1, 2, 3],
      "nullExample": null
    };
    
    final nestedData = {
      "a": 5,
      "b": true,
    };
    
    docData["objectExample"] = nestedData;
    
    db
        .collection("data")
        .doc("one")
        .set(docData)
        .onError((e, _) => print("Error writing document: $e"));
    Java
    Map<String, Object> docData = new HashMap<>();
    docData.put("stringExample", "Hello, World");
    docData.put("booleanExample", false);
    docData.put("numberExample", 3.14159265);
    docData.put("nullExample", null);
    
    ArrayList<Object> arrayExample = new ArrayList<>();
    Collections.addAll(arrayExample, 5L, true, "hello");
    docData.put("arrayExample", arrayExample);
    
    Map<String, Object> objectExample = new HashMap<>();
    objectExample.put("a", 5L);
    objectExample.put("b", true);
    
    docData.put("objectExample", objectExample);
    
    ApiFuture<WriteResult> future = db.collection("data").document("one").set(docData);
    System.out.println("Update time : " + future.get().getUpdateTime());
    Python
    data = {
        "stringExample": "Hello, World!",
        "booleanExample": True,
        "numberExample": 3.14159265,
        "dateExample": datetime.datetime.now(tz=datetime.timezone.utc),
        "arrayExample": [5, True, "hello"],
        "nullExample": None,
        "objectExample": {"a": 5, "b": True},
    }
    
    db.collection("data").document("one").set(data)

    Python

    data = {
        "stringExample": "Hello, World!",
        "booleanExample": True,
        "numberExample": 3.14159265,
        "dateExample": datetime.datetime.now(tz=datetime.timezone.utc),
        "arrayExample": [5, True, "hello"],
        "nullExample": None,
        "objectExample": {"a": 5, "b": True},
    }
    
    await db.collection("data").document("one").set(data)
    C++
    MapFieldValue doc_data{
        {"stringExample", FieldValue::String("Hello world!")},
        {"booleanExample", FieldValue::Boolean(true)},
        {"numberExample", FieldValue::Double(3.14159265)},
        {"dateExample", FieldValue::Timestamp(Timestamp::Now())},
        {"arrayExample", FieldValue::Array({FieldValue::Integer(1),
                                            FieldValue::Integer(2),
                                            FieldValue::Integer(3)})},
        {"nullExample", FieldValue::Null()},
        {"objectExample",
         FieldValue::Map(
             {{"a", FieldValue::Integer(5)},
              {"b", FieldValue::Map(
                        {{"nested", FieldValue::String("foo")}})}})},
    };
    
    db->Collection("data").Document("one").Set(doc_data).OnCompletion(
        [](const Future<void>& future) {
          if (future.error() == Error::kErrorOk) {
            std::cout << "DocumentSnapshot successfully written!" << std::endl;
          } else {
            std::cout << "Error writing document: " << future.error_message()
                      << std::endl;
          }
        });
    Node.js
    const data = {
      stringExample: 'Hello, World!',
      booleanExample: true,
      numberExample: 3.14159265,
      dateExample: Timestamp.fromDate(new Date('December 10, 1815')),
      arrayExample: [5, true, 'hello'],
      nullExample: null,
      objectExample: {
        a: 5,
        b: true
      }
    };
    
    const res = await db.collection('data').doc('one').set(data);
    Tiến hành
    
    import (
    	"context"
    	"log"
    	"time"
    
    	"cloud.google.com/go/firestore"
    )
    
    func addDocDataTypes(ctx context.Context, client *firestore.Client) error {
    	doc := make(map[string]interface{})
    	doc["stringExample"] = "Hello world!"
    	doc["booleanExample"] = true
    	doc["numberExample"] = 3.14159265
    	doc["dateExample"] = time.Now()
    	doc["arrayExample"] = []interface{}{5, true, "hello"}
    	doc["nullExample"] = nil
    	doc["objectExample"] = map[string]interface{}{
    		"a": 5,
    		"b": true,
    	}
    
    	_, err := client.Collection("data").Doc("one").Set(ctx, doc)
    	if err != nil {
    		// Handle any errors in an appropriate way, such as returning them.
    		log.Printf("An error has occurred: %s", err)
    	}
    
    	return err
    }
    
    PHP

    PHP

    Để biết thêm thông tin về cách cài đặt và tạo ứng dụng Cloud Firestore, hãy tham khảo Thư viện ứng dụng Cloud Firestore.

    $data = [
        'stringExample' => 'Hello World',
        'booleanExample' => true,
        'numberExample' => 3.14159265,
        'dateExample' => new Timestamp(new DateTime()),
        'arrayExample' => array(5, true, 'hello'),
        'nullExample' => null,
        'objectExample' => ['a' => 5, 'b' => true],
        'documentReferenceExample' => $db->collection('samples/php/data')->document('two'),
    ];
    $db->collection('samples/php/data')->document('one')->set($data);
    printf('Set multiple data-type data for the one document in the data collection.' . PHP_EOL);
    Unity
    DocumentReference docRef = db.Collection("data").Document("one");
    Dictionary<string, object> docData = new Dictionary<string, object>
    {
    	{ "stringExample", "Hello World" },
    	{ "booleanExample", false },
    	{ "numberExample", 3.14159265 },
    	{ "nullExample", null },
    	{ "arrayExample", new List<object>() { 5, true, "Hello" } },
    	{ "objectExample", new Dictionary<string, object>
    		{
    			{ "a", 5 },
    			{ "b", true },
    		}
    	},
    };
    
    docRef.SetAsync(docData);
    C#
    DocumentReference docRef = db.Collection("data").Document("one");
    Dictionary<string, object> docData = new Dictionary<string, object>
    {
        { "stringExample", "Hello World" },
        { "booleanExample", false },
        { "numberExample", 3.14159265 },
        { "nullExample", null },
        { "arrayExample", new object[] { 5, true, "Hello" } },
        { "objectExample", new Dictionary<string, object>
            {
                { "a", 5 },
                { "b", true},
            }
        }
    };
    
    await docRef.SetAsync(docData);
    Ruby
    doc_ref = firestore.doc "#{collection_path}/one"
    
    data = {
      stringExample:  "Hello, World!",
      booleanExample: true,
      numberExample:  3.14159265,
      dateExample:    DateTime.now,
      arrayExample:   [5, true, "hello"],
      nullExample:    nil,
      objectExample:  {
        a: 5,
        b: true
      }
    }
    
    doc_ref.set data

    Đối tượng tuỳ chỉnh

    Việc sử dụng đối tượng Map hoặc Dictionary để biểu thị tài liệu thường gây bất tiện, vì vậy, Cloud Firestore hỗ trợ việc ghi tài liệu bằng các lớp tuỳ chỉnh. Cloud Firestore chuyển đổi các đối tượng thành kiểu dữ liệu được hỗ trợ.

    Khi sử dụng các lớp tuỳ chỉnh, bạn có thể viết lại ví dụ ban đầu theo cách sau:

    Web

    class City {
        constructor (name, state, country ) {
            this.name = name;
            this.state = state;
            this.country = country;
        }
        toString() {
            return this.name + ', ' + this.state + ', ' + this.country;
        }
    }
    
    // Firestore data converter
    const cityConverter = {
        toFirestore: (city) => {
            return {
                name: city.name,
                state: city.state,
                country: city.country
                };
        },
        fromFirestore: (snapshot, options) => {
            const data = snapshot.data(options);
            return new City(data.name, data.state, data.country);
        }
    };

    Web

    class City {
        constructor (name, state, country ) {
            this.name = name;
            this.state = state;
            this.country = country;
        }
        toString() {
            return this.name + ', ' + this.state + ', ' + this.country;
        }
    }
    
    // Firestore data converter
    var cityConverter = {
        toFirestore: function(city) {
            return {
                name: city.name,
                state: city.state,
                country: city.country
                };
        },
        fromFirestore: function(snapshot, options){
            const data = snapshot.data(options);
            return new City(data.name, data.state, data.country);
        }
    };
    Swift
    Lưu ý: Sản phẩm này không dùng được trên các mục tiêu watchOS và App Clip.
    public struct City: Codable {
    
      let name: String
      let state: String?
      let country: String?
      let isCapital: Bool?
      let population: Int64?
    
      enum CodingKeys: String, CodingKey {
        case name
        case state
        case country
        case isCapital = "capital"
        case population
      }
    
    }
    Objective-C
    Lưu ý: Sản phẩm này không dùng được trên các mục tiêu watchOS và App Clip.
    // This isn't supported in Objective-C.
      

    Kotlin+KTX

    data class City(
        val name: String? = null,
        val state: String? = null,
        val country: String? = null,
        @field:JvmField // use this annotation if your Boolean field is prefixed with 'is'
        val isCapital: Boolean? = null,
        val population: Long? = null,
        val regions: List<String>? = null,
    )

    Java

    Mỗi lớp tuỳ chỉnh phải có một hàm khởi tạo công khai không nhận tham số. Ngoài ra, lớp này phải bao gồm một phương thức getter công khai cho mỗi thuộc tính.

    public class City {
    
    
        private String name;
        private String state;
        private String country;
        private boolean capital;
        private long population;
        private List<String> regions;
    
        public City() {}
    
        public City(String name, String state, String country, boolean capital, long population, List<String> regions) {
            // ...
        }
    
        public String getName() {
            return name;
        }
    
        public String getState() {
            return state;
        }
    
        public String getCountry() {
            return country;
        }
    
        public boolean isCapital() {
            return capital;
        }
    
        public long getPopulation() {
            return population;
        }
    
        public List<String> getRegions() {
            return regions;
        }
    
    }

    Dart

    class City {
      final String? name;
      final String? state;
      final String? country;
      final bool? capital;
      final int? population;
      final List<String>? regions;
    
      City({
        this.name,
        this.state,
        this.country,
        this.capital,
        this.population,
        this.regions,
      });
    
      factory City.fromFirestore(
        DocumentSnapshot<Map<String, dynamic>> snapshot,
        SnapshotOptions? options,
      ) {
        final data = snapshot.data();
        return City(
          name: data?['name'],
          state: data?['state'],
          country: data?['country'],
          capital: data?['capital'],
          population: data?['population'],
          regions:
              data?['regions'] is Iterable ? List.from(data?['regions']) : null,
        );
      }
    
      Map<String, dynamic> toFirestore() {
        return {
          if (name != null) "name": name,
          if (state != null) "state": state,
          if (country != null) "country": country,
          if (capital != null) "capital": capital,
          if (population != null) "population": population,
          if (regions != null) "regions": regions,
        };
      }
    }
    Java
    public City() {
      // Must have a public no-argument constructor
    }
    
    // Initialize all fields of a city
    public City(
        String name,
        String state,
        String country,
        Boolean capital,
        Long population,
        List<String> regions) {
      this.name = name;
      this.state = state;
      this.country = country;
      this.capital = capital;
      this.population = population;
      this.regions = regions;
    }
    Python
    class City:
        def __init__(self, name, state, country, capital=False, population=0, regions=[]):
            self.name = name
            self.state = state
            self.country = country
            self.capital = capital
            self.population = population
            self.regions = regions
    
        @staticmethod
        def from_dict(source):
            # ...
    
        def to_dict(self):
            # ...
    
        def __repr__(self):
            return f"City(\
                    name={self.name}, \
                    country={self.country}, \
                    population={self.population}, \
                    capital={self.capital}, \
                    regions={self.regions}\
                )"
    
    

    Python

    class City:
        def __init__(self, name, state, country, capital=False, population=0, regions=[]):
            self.name = name
            self.state = state
            self.country = country
            self.capital = capital
            self.population = population
            self.regions = regions
    
        @staticmethod
        def from_dict(source):
            # ...
    
        def to_dict(self):
            # ...
    
        def __repr__(self):
            return f"City(\
                    name={self.name}, \
                    country={self.country}, \
                    population={self.population}, \
                    capital={self.capital}, \
                    regions={self.regions}\
                )"
    
    
    C++
    // This is not yet supported.
    Node.js
    // Node.js uses JavaScript objects
    Tiến hành
    
    // City represents a city.
    type City struct {
    	Name       string   `firestore:"name,omitempty"`
    	State      string   `firestore:"state,omitempty"`
    	Country    string   `firestore:"country,omitempty"`
    	Capital    bool     `firestore:"capital,omitempty"`
    	Population int64    `firestore:"population,omitempty"`
    	Density    int64    `firestore:"density,omitempty"`
    	Regions    []string `firestore:"regions,omitempty"`
    }
    
    PHP

    PHP

    Để biết thêm thông tin về cách cài đặt và tạo ứng dụng Cloud Firestore, hãy tham khảo Thư viện ứng dụng Cloud Firestore.

    class City
    {
        /** @var string */
        public $name;
        /** @var string */
        public $state;
        /** @var string */
        public $country;
        /** @var bool */
        public $capital;
        /** @var int */
        public $population;
        /** @var array<string> */
        public $regions;
    
        /**
         * @param array<string> $regions
         */
        public function __construct(
            string $name,
            string $state,
            string $country,
            bool $capital = false,
            int $population = 0,
            array $regions = []
        ) {
            $this->name = $name;
            $this->state = $state;
            $this->country = $country;
            $this->capital = $capital;
            $this->population = $population;
            $this->regions = $regions;
        }
    
        /**
         * @param array<mixed> $source
         */
        public static function fromArray(array $source): City
        {
            // implementation of fromArray is excluded for brevity
            # ...
        }
    
        /**
         * @return array<mixed>
         */
        public function toArray(): array
        {
            // implementation of toArray is excluded for brevity
            # ...
        }
    
        public function __toString()
        {
            // implementation of __toString is excluded for brevity
            # ...
        }
    }
    
    Unity
    [FirestoreData]
    public class City
    {
    	[FirestoreProperty]
    	public string Name { get; set; }
    
    	[FirestoreProperty]
    	public string State { get; set; }
    
    	[FirestoreProperty]
    	public string Country { get; set; }
    
    	[FirestoreProperty]
    	public bool Capital { get; set; }
    
    	[FirestoreProperty]
    	public long Population { get; set; }
    }
    C#
    [FirestoreData]
    public class City
    {
        [FirestoreProperty]
        public string Name { get; set; }
    
        [FirestoreProperty]
        public string State { get; set; }
    
        [FirestoreProperty]
        public string Country { get; set; }
    
        [FirestoreProperty]
        public bool Capital { get; set; }
    
        [FirestoreProperty]
        public long Population { get; set; }
    }
    Ruby
    // This isn't supported in Ruby

    Web

    import { doc, setDoc } from "firebase/firestore"; 
    
    // Set with cityConverter
    const ref = doc(db, "cities", "LA").withConverter(cityConverter);
    await setDoc(ref, new City("Los Angeles", "CA", "USA"));

    Web

    // Set with cityConverter
    db.collection("cities").doc("LA")
      .withConverter(cityConverter)
      .set(new City("Los Angeles", "CA", "USA"));
    Swift
    Lưu ý: Sản phẩm này không dùng được trên các mục tiêu watchOS và App Clip.
    let city = City(name: "Los Angeles",
                    state: "CA",
                    country: "USA",
                    isCapital: false,
                    population: 5000000)
    
    do {
      try db.collection("cities").document("LA").setData(from: city)
    } catch let error {
      print("Error writing city to Firestore: \(error)")
    }
    Objective-C
    Lưu ý: Sản phẩm này không dùng được trên các mục tiêu watchOS và App Clip.
    // This isn't supported in Objective-C.
      

    Kotlin+KTX

    val city = City(
        "Los Angeles",
        "CA",
        "USA",
        false,
        5000000L,
        listOf("west_coast", "socal"),
    )
    db.collection("cities").document("LA").set(city)

    Java

    City city = new City("Los Angeles", "CA", "USA",
            false, 5000000L, Arrays.asList("west_coast", "sorcal"));
    db.collection("cities").document("LA").set(city);

    Dart

    final city = City(
      name: "Los Angeles",
      state: "CA",
      country: "USA",
      capital: false,
      population: 5000000,
      regions: ["west_coast", "socal"],
    );
    final docRef = db
        .collection("cities")
        .withConverter(
          fromFirestore: City.fromFirestore,
          toFirestore: (City city, options) => city.toFirestore(),
        )
        .doc("LA");
    await docRef.set(city);
    Java
    City city =
        new City("Los Angeles", "CA", "USA", false, 3900000L, Arrays.asList("west_coast", "socal"));
    ApiFuture<WriteResult> future = db.collection("cities").document("LA").set(city);
    // block on response if required
    System.out.println("Update time : " + future.get().getUpdateTime());
    Python
    city = City(name="Los Angeles", state="CA", country="USA")
    db.collection("cities").document("LA").set(city.to_dict())

    Python

    city = City(name="Los Angeles", state="CA", country="USA")
    await db.collection("cities").document("LA").set(city.to_dict())
    C++
    // This is not yet supported.
    Node.js
    // Node.js uses JavaScript objects
    Tiến hành
    
    import (
    	"context"
    	"log"
    
    	"cloud.google.com/go/firestore"
    )
    
    func addDocAsEntity(ctx context.Context, client *firestore.Client) error {
    	city := City{
    		Name:    "Los Angeles",
    		Country: "USA",
    	}
    	_, err := client.Collection("cities").Doc("LA").Set(ctx, city)
    	if err != nil {
    		// Handle any errors in an appropriate way, such as returning them.
    		log.Printf("An error has occurred: %s", err)
    	}
    
    	return err
    }
    
    PHP
    // This isn't supported in PHP.
    Unity
    DocumentReference docRef = db.Collection("cities").Document("LA");
    City city = new City
    {
    	Name = "Los Angeles",
    	State = "CA",
    	Country = "USA",
    	Capital = false,
    	Population = 3900000L
    };
    docRef.SetAsync(city);
    C#
    DocumentReference docRef = db.Collection("cities").Document("LA");
    City city = new City
    {
        Name = "Los Angeles",
        State = "CA",
        Country = "USA",
        Capital = false,
        Population = 3900000L
    };
    await docRef.SetAsync(city);
    Ruby
    // This isn't supported in Ruby.

    Thêm tài liệu

    Khi sử dụng set() để tạo tài liệu, bạn phải chỉ định mã nhận dạng cho tài liệu cần tạo, như trong ví dụ sau:

    Web

    import { doc, setDoc } from "firebase/firestore"; 
    
    await setDoc(doc(db, "cities", "new-city-id"), data);

    Web

    db.collection("cities").doc("new-city-id").set(data);
    Swift
    Lưu ý: Sản phẩm này không dùng được trên các mục tiêu watchOS và App Clip.
    db.collection("cities").document("new-city-id").setData(data)
    Objective-C
    Lưu ý: Sản phẩm này không dùng được trên các mục tiêu watchOS và App Clip.
    [[[self.db collectionWithPath:@"cities"] documentWithPath:@"new-city-id"]
        setData:data];

    Kotlin+KTX

    db.collection("cities").document("new-city-id").set(data)

    Java

    db.collection("cities").document("new-city-id").set(data);

    Dart

    db.collection("cities").doc("new-city-id").set({"name": "Chicago"});
    Java
    db.collection("cities").document("new-city-id").set(data);
    Python
    db.collection("cities").document("new-city-id").set(data)

    Python

    await db.collection("cities").document("new-city-id").set(data)
    C++
    db->Collection("cities").Document("SF").Set({/*some data*/});
    Node.js
    await db.collection('cities').doc('new-city-id').set(data);
    Tiến hành
    
    import (
    	"context"
    	"log"
    
    	"cloud.google.com/go/firestore"
    )
    
    func addDocWithID(ctx context.Context, client *firestore.Client) error {
    	var data = make(map[string]interface{})
    
    	_, err := client.Collection("cities").Doc("new-city-id").Set(ctx, data)
    	if err != nil {
    		// Handle any errors in an appropriate way, such as returning them.
    		log.Printf("An error has occurred: %s", err)
    	}
    
    	return err
    }
    
    PHP

    PHP

    Để biết thêm thông tin về cách cài đặt và tạo ứng dụng Cloud Firestore, hãy tham khảo Thư viện ứng dụng Cloud Firestore.

    $db->collection('samples/php/cities')->document('new-city-id')->set($data);
    Unity
    db.Collection("cities").Document("new-city-id").SetAsync(city);
    C#
    await db.Collection("cities").Document("new-city-id").SetAsync(city);
    Ruby
    city_ref = firestore.doc "#{collection_path}/new-city-id"
    city_ref.set data

    Nếu tài liệu không có mã nhận dạng có ý nghĩa, thì Cloud Firestore có thể tự động tạo một mã nhận dạng cho bạn. Bạn có thể gọi các phương thức add() dành riêng cho ngôn ngữ sau:

    Web

    Sử dụng phương thức addDoc():

    import { collection, addDoc } from "firebase/firestore"; 
    
    // Add a new document with a generated id.
    const docRef = await addDoc(collection(db, "cities"), {
      name: "Tokyo",
      country: "Japan"
    });
    console.log("Document written with ID: ", docRef.id);

    Web

    Sử dụng phương thức add():

    // Add a new document with a generated id.
    db.collection("cities").add({
        name: "Tokyo",
        country: "Japan"
    })
    .then((docRef) => {
        console.log("Document written with ID: ", docRef.id);
    })
    .catch((error) => {
        console.error("Error adding document: ", error);
    });
    Swift

    Sử dụng phương thức addDocument():

    Lưu ý: Sản phẩm này không dùng được trên các mục tiêu watchOS và App Clip.
    // Add a new document with a generated id.
    do {
      let ref = try await db.collection("cities").addDocument(data: [
        "name": "Tokyo",
        "country": "Japan"
      ])
      print("Document added with ID: \(ref.documentID)")
    } catch {
      print("Error adding document: \(error)")
    }
    Objective-C

    Sử dụng phương thức addDocumentWithData::

    Lưu ý: Sản phẩm này không dùng được trên các mục tiêu watchOS và App Clip.
    // Add a new document with a generated id.
    __block FIRDocumentReference *ref =
        [[self.db collectionWithPath:@"cities"] addDocumentWithData:@{
          @"name": @"Tokyo",
          @"country": @"Japan"
        } completion:^(NSError * _Nullable error) {
          if (error != nil) {
            NSLog(@"Error adding document: %@", error);
          } else {
            NSLog(@"Document added with ID: %@", ref.documentID);
          }
        }];

    Kotlin+KTX

    Sử dụng phương thức add():

    // Add a new document with a generated id.
    val data = hashMapOf(
        "name" to "Tokyo",
        "country" to "Japan",
    )
    
    db.collection("cities")
        .add(data)
        .addOnSuccessListener { documentReference ->
            Log.d(TAG, "DocumentSnapshot written with ID: ${documentReference.id}")
        }
        .addOnFailureListener { e ->
            Log.w(TAG, "Error adding document", e)
        }

    Java

    Sử dụng phương thức add():

    // Add a new document with a generated id.
    Map<String, Object> data = new HashMap<>();
    data.put("name", "Tokyo");
    data.put("country", "Japan");
    
    db.collection("cities")
            .add(data)
            .addOnSuccessListener(new OnSuccessListener<DocumentReference>() {
                @Override
                public void onSuccess(DocumentReference documentReference) {
                    Log.d(TAG, "DocumentSnapshot written with ID: " + documentReference.getId());
                }
            })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Log.w(TAG, "Error adding document", e);
                }
            });

    Dart

    Sử dụng phương thức add():

    // Add a new document with a generated id.
    final data = {"name": "Tokyo", "country": "Japan"};
    
    db.collection("cities").add(data).then((documentSnapshot) =>
        print("Added Data with ID: ${documentSnapshot.id}"));
    Java

    Sử dụng phương thức add():

    // Add document data with auto-generated id.
    Map<String, Object> data = new HashMap<>();
    data.put("name", "Tokyo");
    data.put("country", "Japan");
    ApiFuture<DocumentReference> addedDocRef = db.collection("cities").add(data);
    System.out.println("Added document with ID: " + addedDocRef.get().getId());
    Python

    Sử dụng phương thức add():

    city = {"name": "Tokyo", "country": "Japan"}
    update_time, city_ref = db.collection("cities").add(city)
    print(f"Added document with id {city_ref.id}")

    Python

    Sử dụng phương thức add():

    city = City(name="Tokyo", state=None, country="Japan")
    await db.collection("cities").add(city.to_dict())
    C++

    Sử dụng phương thức Add():

    db->Collection("cities").Add({/*some data*/});
    Node.js

    Sử dụng phương thức add():

    // Add a new document with a generated id.
    const res = await db.collection('cities').add({
      name: 'Tokyo',
      country: 'Japan'
    });
    
    console.log('Added document with ID: ', res.id);
    Tiến hành

    Sử dụng phương thức Add():

    
    import (
    	"context"
    	"log"
    
    	"cloud.google.com/go/firestore"
    )
    
    func addDocWithoutID(ctx context.Context, client *firestore.Client) error {
    	_, _, err := client.Collection("cities").Add(ctx, map[string]interface{}{
    		"name":    "Tokyo",
    		"country": "Japan",
    	})
    	if err != nil {
    		// Handle any errors in an appropriate way, such as returning them.
    		log.Printf("An error has occurred: %s", err)
    	}
    
    	return err
    }
    
    PHP

    Sử dụng phương thức add():

    PHP

    Để biết thêm thông tin về cách cài đặt và tạo ứng dụng Cloud Firestore, hãy tham khảo Thư viện ứng dụng Cloud Firestore.

    $data = [
        'name' => 'Tokyo',
        'country' => 'Japan'
    ];
    $addedDocRef = $db->collection('samples/php/cities')->add($data);
    printf('Added document with ID: %s' . PHP_EOL, $addedDocRef->id());
    Unity

    Sử dụng phương thức AddAsync():

    Dictionary<string, object> city = new Dictionary<string, object>
    {
    	{ "Name", "Tokyo" },
    	{ "Country", "Japan" }
    };
    db.Collection("cities").AddAsync(city).ContinueWithOnMainThread(task => {
    	DocumentReference addedDocRef = task.Result;
    	Debug.Log(String.Format("Added document with ID: {0}.", addedDocRef.Id));
    });
    C#

    Sử dụng phương thức AddAsync():

    Dictionary<string, object> city = new Dictionary<string, object>
    {
        { "Name", "Tokyo" },
        { "Country", "Japan" }
    };
    DocumentReference addedDocRef = await db.Collection("cities").AddAsync(city);
    Console.WriteLine("Added document with ID: {0}.", addedDocRef.Id);
    Ruby

    Sử dụng phương thức add():

    data = {
      name:    "Tokyo",
      country: "Japan"
    }
    
    cities_ref = firestore.col collection_path
    
    added_doc_ref = cities_ref.add data
    puts "Added document with ID: #{added_doc_ref.document_id}."

    Trong một số trường hợp, bạn có thể tạo tệp đối chiếu tài liệu bằng mã nhận dạng được tạo tự động, sau đó sử dụng tệp đối chiếu đó sau này. Đối với trường hợp sử dụng này, bạn có thể gọi doc() theo cách sau:

    Web

    import { collection, doc, setDoc } from "firebase/firestore"; 
    
    // Add a new document with a generated id
    const newCityRef = doc(collection(db, "cities"));
    
    // later...
    await setDoc(newCityRef, data);

    Web

    // Add a new document with a generated id.
    var newCityRef = db.collection("cities").doc();
    
    // later...
    newCityRef.set(data);
    Swift
    Lưu ý: Sản phẩm này không dùng được trên các mục tiêu watchOS và App Clip.
    let newCityRef = db.collection("cities").document()
    
    // later...
    newCityRef.setData([
      // ...
    ])
    Objective-C
    Lưu ý: Sản phẩm này không dùng được trên các mục tiêu watchOS và App Clip.
    FIRDocumentReference *newCityRef = [[self.db collectionWithPath:@"cities"] documentWithAutoID];
    // later...
    [newCityRef setData:@{ /* ... */ }];

    Kotlin+KTX

    val data = HashMap<String, Any>()
    
    val newCityRef = db.collection("cities").document()
    
    // Later...
    newCityRef.set(data)

    Java

    Map<String, Object> data = new HashMap<>();
    
    DocumentReference newCityRef = db.collection("cities").document();
    
    // Later...
    newCityRef.set(data);

    Dart

    // Add a new document with a generated id.
    final data = <String, dynamic>{};
    
    final newCityRef = db.collection("cities").doc();
    
    // Later...
    newCityRef.set(data);
    
    Java
    // Add document data after generating an id.
    DocumentReference addedDocRef = db.collection("cities").document();
    System.out.println("Added document with ID: " + addedDocRef.getId());
    
    // later...
    ApiFuture<WriteResult> writeResult = addedDocRef.set(data);
    Python
    new_city_ref = db.collection("cities").document()
    
    # later...
    new_city_ref.set(
        {
            # ...
        }
    )

    Python

    new_city_ref = db.collection("cities").document()
    
    # later...
    await new_city_ref.set(
        {
            # ...
        }
    )
    C++
    DocumentReference new_city_ref = db->Collection("cities").Document();
    Node.js
    const newCityRef = db.collection('cities').doc();
    
    // Later...
    const res = await newCityRef.set({
      // ...
    });
    Tiến hành
    
    import (
    	"context"
    	"log"
    
    	"cloud.google.com/go/firestore"
    )
    
    func addDocAfterAutoGeneratedID(ctx context.Context, client *firestore.Client) error {
    	data := City{
    		Name:    "Sydney",
    		Country: "Australia",
    	}
    
    	ref := client.Collection("cities").NewDoc()
    
    	// later...
    	_, err := ref.Set(ctx, data)
    	if err != nil {
    		// Handle any errors in an appropriate way, such as returning them.
    		log.Printf("An error has occurred: %s", err)
    	}
    
    	return err
    }
    
    PHP

    PHP

    Để biết thêm thông tin về cách cài đặt và tạo ứng dụng Cloud Firestore, hãy tham khảo Thư viện ứng dụng Cloud Firestore.

    $addedDocRef = $db->collection('samples/php/cities')->newDocument();
    printf('Added document with ID: %s' . PHP_EOL, $addedDocRef->id());
    $addedDocRef->set($data);
    Unity
    DocumentReference addedDocRef = db.Collection("cities").Document();
    Debug.Log(String.Format("Added document with ID: {0}.", addedDocRef.Id));
    addedDocRef.SetAsync(city).ContinueWithOnMainThread(task => {
    	Debug.Log(String.Format(
    		"Added data to the {0} document in the cities collection.", addedDocRef.Id));
    });
    C#
    DocumentReference addedDocRef = db.Collection("cities").Document();
    Console.WriteLine("Added document with ID: {0}.", addedDocRef.Id);
    await addedDocRef.SetAsync(city);
    Ruby
    cities_ref = firestore.col collection_path
    
    added_doc_ref = cities_ref.doc
    puts "Added document with ID: #{added_doc_ref.document_id}."
    
    added_doc_ref.set data

    Trong phần phụ trợ, .add(...).doc().set(...) tương đương nhau, vì vậy, bạn có thể sử dụng một trong hai tuỳ chọn này.

    Cập nhật tài liệu

    Để cập nhật một số trường của tài liệu mà không cần ghi đè toàn bộ tài liệu, hãy sử dụng các phương thức update() dành riêng cho từng ngôn ngữ sau:

    Web

    Sử dụng phương thức updateDoc():

    import { doc, updateDoc } from "firebase/firestore";
    
    const washingtonRef = doc(db, "cities", "DC");
    
    // Set the "capital" field of the city 'DC'
    await updateDoc(washingtonRef, {
      capital: true
    });

    Web

    Sử dụng phương thức update():

    var washingtonRef = db.collection("cities").doc("DC");
    
    // Set the "capital" field of the city 'DC'
    return washingtonRef.update({
        capital: true
    })
    .then(() => {
        console.log("Document successfully updated!");
    })
    .catch((error) => {
        // The document probably doesn't exist.
        console.error("Error updating document: ", error);
    });
    Swift

    Sử dụng phương thức updateData():

    Lưu ý: Sản phẩm này không hoạt động trên các mục tiêu watchOS và App Clip.
    let washingtonRef = db.collection("cities").document("DC")
    
    // Set the "capital" field of the city 'DC'
    do {
      try await washingtonRef.updateData([
        "capital": true
      ])
      print("Document successfully updated")
    } catch {
      print("Error updating document: \(error)")
    }
    Objective-C

    Sử dụng phương thức updateData::

    Lưu ý: Sản phẩm này không dùng được trên các mục tiêu watchOS và App Clip.
    FIRDocumentReference *washingtonRef =
        [[self.db collectionWithPath:@"cities"] documentWithPath:@"DC"];
    // Set the "capital" field of the city
    [washingtonRef updateData:@{
      @"capital": @YES
    } completion:^(NSError * _Nullable error) {
      if (error != nil) {
        NSLog(@"Error updating document: %@", error);
      } else {
        NSLog(@"Document successfully updated");
      }
    }];

    Kotlin+KTX

    Sử dụng phương thức update():

    val washingtonRef = db.collection("cities").document("DC")
    
    // Set the "isCapital" field of the city 'DC'
    washingtonRef
        .update("capital", true)
        .addOnSuccessListener { Log.d(TAG, "DocumentSnapshot successfully updated!") }
        .addOnFailureListener { e -> Log.w(TAG, "Error updating document", e) }

    Java

    Sử dụng phương thức update():

    DocumentReference washingtonRef = db.collection("cities").document("DC");
    
    // Set the "isCapital" field of the city 'DC'
    washingtonRef
            .update("capital", true)
            .addOnSuccessListener(new OnSuccessListener<Void>() {
                @Override
                public void onSuccess(Void aVoid) {
                    Log.d(TAG, "DocumentSnapshot successfully updated!");
                }
            })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Log.w(TAG, "Error updating document", e);
                }
            });

    Dart

    Sử dụng phương thức update():

    final washingtonRef = db.collection("cites").doc("DC");
    washingtonRef.update({"capital": true}).then(
        (value) => print("DocumentSnapshot successfully updated!"),
        onError: (e) => print("Error updating document $e"));
    Java

    Sử dụng phương thức update():

    // Update an existing document
    DocumentReference docRef = db.collection("cities").document("DC");
    
    // (async) Update one field
    ApiFuture<WriteResult> future = docRef.update("capital", true);
    
    // ...
    WriteResult result = future.get();
    System.out.println("Write result: " + result);
    Python

    Sử dụng phương thức update():

    city_ref = db.collection("cities").document("DC")
    
    # Set the capital field
    city_ref.update({"capital": True})

    Python

    Sử dụng phương thức update():

    city_ref = db.collection("cities").document("DC")
    
    # Set the capital field
    await city_ref.update({"capital": True})
    C++

    Sử dụng phương thức Update():

    DocumentReference washington_ref = db->Collection("cities").Document("DC");
    // Set the "capital" field of the city "DC".
    washington_ref.Update({{"capital", FieldValue::Boolean(true)}});
    Node.js

    Sử dụng phương thức update():

    const cityRef = db.collection('cities').doc('DC');
    
    // Set the 'capital' field of the city
    const res = await cityRef.update({capital: true});
    Tiến hành

    Sử dụng phương thức Update():

    
    import (
    	"context"
    	"log"
    
    	"cloud.google.com/go/firestore"
    )
    
    func updateDoc(ctx context.Context, client *firestore.Client) error {
    	// ...
    
    	_, err := client.Collection("cities").Doc("DC").Update(ctx, []firestore.Update{
    		{
    			Path:  "capital",
    			Value: true,
    		},
    	})
    	if err != nil {
    		// Handle any errors in an appropriate way, such as returning them.
    		log.Printf("An error has occurred: %s", err)
    	}
    
    	return err
    }
    
    PHP

    Sử dụng phương thức update():

    PHP

    Để biết thêm thông tin về cách cài đặt và tạo ứng dụng Cloud Firestore, hãy tham khảo Thư viện ứng dụng Cloud Firestore.

    $cityRef = $db->collection('samples/php/cities')->document('DC');
    $cityRef->update([
        ['path' => 'capital', 'value' => true]
    ]);
    Unity

    Sử dụng phương thức UpdateAsync():

    DocumentReference cityRef = db.Collection("cities").Document("new-city-id");
    Dictionary<string, object> updates = new Dictionary<string, object>
    {
    	{ "Capital", false }
    };
    
    cityRef.UpdateAsync(updates).ContinueWithOnMainThread(task => {
    	Debug.Log(
    		"Updated the Capital field of the new-city-id document in the cities collection.");
    });
    // You can also update a single field with: cityRef.UpdateAsync("Capital", false);
    C#

    Sử dụng phương thức UpdateAsync():

    DocumentReference cityRef = db.Collection("cities").Document("new-city-id");
    Dictionary<string, object> updates = new Dictionary<string, object>
    {
        { "Capital", false }
    };
    await cityRef.UpdateAsync(updates);
    
    // You can also update a single field with: await cityRef.UpdateAsync("Capital", false);
    Ruby

    Sử dụng phương thức update():

    city_ref = firestore.doc "#{collection_path}/DC"
    city_ref.update({ capital: true })

    Dấu thời gian của máy chủ

    Bạn có thể đặt một trường trong tài liệu thành dấu thời gian máy chủ để theo dõi thời điểm máy chủ nhận được bản cập nhật.

    Web

    import { updateDoc, serverTimestamp } from "firebase/firestore";
    
    const docRef = doc(db, 'objects', 'some-id');
    
    // Update the timestamp field with the value from the server
    const updateTimestamp = await updateDoc(docRef, {
        timestamp: serverTimestamp()
    });

    Web

    var docRef = db.collection('objects').doc('some-id');
    
    // Update the timestamp field with the value from the server
    var updateTimestamp = docRef.update({
        timestamp: firebase.firestore.FieldValue.serverTimestamp()
    });
    Swift
    Lưu ý: Sản phẩm này không dùng được trên các mục tiêu watchOS và App Clip.
    do {
      try await db.collection("objects").document("some-id").updateData([
        "lastUpdated": FieldValue.serverTimestamp(),
      ])
      print("Document successfully updated")
    } catch {
      print("Error updating document: \(error)")
    }
    Objective-C
    Lưu ý: Sản phẩm này không dùng được trên các mục tiêu watchOS và App Clip.
    [[[self.db collectionWithPath:@"objects"] documentWithPath:@"some-id"] updateData:@{
      @"lastUpdated": [FIRFieldValue fieldValueForServerTimestamp]
    } completion:^(NSError * _Nullable error) {
      if (error != nil) {
        NSLog(@"Error updating document: %@", error);
      } else {
        NSLog(@"Document successfully updated");
      }
    }];

    Kotlin+KTX

    // If you're using custom Kotlin objects in Android, add an @ServerTimestamp
    // annotation to a Date field for your custom object classes. This indicates
    // that the Date field should be treated as a server timestamp by the object mapper.
    val docRef = db.collection("objects").document("some-id")
    
    // Update the timestamp field with the value from the server
    val updates = hashMapOf<String, Any>(
        "timestamp" to FieldValue.serverTimestamp(),
    )
    
    docRef.update(updates).addOnCompleteListener { }

    Java

    // If you're using custom Java objects in Android, add an @ServerTimestamp
    // annotation to a Date field for your custom object classes. This indicates
    // that the Date field should be treated as a server timestamp by the object mapper.
    DocumentReference docRef = db.collection("objects").document("some-id");
    
    // Update the timestamp field with the value from the server
    Map<String,Object> updates = new HashMap<>();
    updates.put("timestamp", FieldValue.serverTimestamp());
    
    docRef.update(updates).addOnCompleteListener(new OnCompleteListener<Void>() {
        // ...
        // ...

    Dart

    final docRef = db.collection("objects").doc("some-id");
    final updates = <String, dynamic>{
      "timestamp": FieldValue.serverTimestamp(),
    };
    
    docRef.update(updates).then(
        (value) => print("DocumentSnapshot successfully updated!"),
        onError: (e) => print("Error updating document $e"));
    Java
    DocumentReference docRef = db.collection("objects").document("some-id");
    // Update the timestamp field with the value from the server
    ApiFuture<WriteResult> writeResult = docRef.update("timestamp", FieldValue.serverTimestamp());
    System.out.println("Update time : " + writeResult.get());
    Python
    city_ref = db.collection("objects").document("some-id")
    city_ref.update({"timestamp": firestore.SERVER_TIMESTAMP})

    Python

    city_ref = db.collection("objects").document("some-id")
    await city_ref.update({"timestamp": firestore.SERVER_TIMESTAMP})
    C++
    DocumentReference doc_ref = db->Collection("objects").Document("some-id");
    doc_ref.Update({{"timestamp", FieldValue::ServerTimestamp()}})
        .OnCompletion([](const Future<void>& future) {
          // ...
        });
    Node.js
    // Create a document reference
    const docRef = db.collection('objects').doc('some-id');
    
    // Update the timestamp field with the value from the server
    const res = await docRef.update({
      timestamp: FieldValue.serverTimestamp()
    });
    Tiến hành
    
    import (
    	"context"
    	"log"
    
    	"cloud.google.com/go/firestore"
    )
    
    func updateDocServerTimestamp(ctx context.Context, client *firestore.Client) error {
    	// ...
    
    	_, err := client.Collection("objects").Doc("some-id").Set(ctx, map[string]interface{}{
    		"timestamp": firestore.ServerTimestamp,
    	}, firestore.MergeAll)
    	if err != nil {
    		// Handle any errors in an appropriate way, such as returning them.
    		log.Printf("An error has occurred: %s", err)
    	}
    
    	return err
    }
    
    PHP

    PHP

    Để biết thêm thông tin về cách cài đặt và tạo ứng dụng Cloud Firestore, hãy tham khảo Thư viện ứng dụng Cloud Firestore.

    $docRef = $db->collection('samples/php/objects')->document('some-id');
    $docRef->update([
        ['path' => 'timestamp', 'value' => FieldValue::serverTimestamp()]
    ]);
    Unity
    DocumentReference cityRef = db.Collection("cities").Document("new-city-id");
    cityRef.UpdateAsync("Timestamp", FieldValue.ServerTimestamp)
    	.ContinueWithOnMainThread(task => {
    		Debug.Log(
    			"Updated the Timestamp field of the new-city-id document in the cities "
    			+ "collection.");
    	});
    C#
    DocumentReference cityRef = db.Collection("cities").Document("new-city-id");
    await cityRef.UpdateAsync("Timestamp", Timestamp.GetCurrentTimestamp());
    Ruby
    city_ref = firestore.doc "#{collection_path}/new-city-id"
    city_ref.update({ timestamp: firestore.field_server_time })

    Khi cập nhật nhiều trường dấu thời gian bên trong một giao dịch, mỗi trường sẽ nhận được cùng một giá trị dấu thời gian của máy chủ.

    Cập nhật các trường trong đối tượng lồng nhau

    Nếu tài liệu của bạn chứa các đối tượng được lồng, thì bạn có thể sử dụng ký hiệu dấu chấm để tham chiếu các trường được lồng trong tài liệu khi bạn gọi update():

    Web

    import { doc, setDoc, updateDoc } from "firebase/firestore"; 
    
    // Create an initial document to update.
    const frankDocRef = doc(db, "users", "frank");
    await setDoc(frankDocRef, {
        name: "Frank",
        favorites: { food: "Pizza", color: "Blue", subject: "recess" },
        age: 12
    });
    
    // To update age and favorite color:
    await updateDoc(frankDocRef, {
        "age": 13,
        "favorites.color": "Red"
    });

    Web

    // Create an initial document to update.
    var frankDocRef = db.collection("users").doc("frank");
    frankDocRef.set({
        name: "Frank",
        favorites: { food: "Pizza", color: "Blue", subject: "recess" },
        age: 12
    });
    
    // To update age and favorite color:
    db.collection("users").doc("frank").update({
        "age": 13,
        "favorites.color": "Red"
    })
    .then(() => {
        console.log("Document successfully updated!");
    });
    Swift
    Lưu ý: Sản phẩm này không dùng được trên các mục tiêu watchOS và App Clip.
    // Create an initial document to update.
    let frankDocRef = db.collection("users").document("frank")
    do {
      try await frankDocRef.setData([
        "name": "Frank",
        "favorites": [ "food": "Pizza", "color": "Blue", "subject": "recess" ],
        "age": 12
      ])
    
      // To update age and favorite color:
      try await frankDocRef.updateData([
        "age": 13,
        "favorites.color": "Red"
      ])
      print("Document successfully updated")
    } catch {
      print("Error updating document: \(error)")
    }
    Objective-C
    Lưu ý: Sản phẩm này không dùng được trên các mục tiêu watchOS và App Clip.
    // Create an initial document to update.
    FIRDocumentReference *frankDocRef =
        [[self.db collectionWithPath:@"users"] documentWithPath:@"frank"];
    [frankDocRef setData:@{
      @"name": @"Frank",
      @"favorites": @{
        @"food": @"Pizza",
        @"color": @"Blue",
        @"subject": @"recess"
      },
      @"age": @12
    }];
    // To update age and favorite color:
    [frankDocRef updateData:@{
      @"age": @13,
      @"favorites.color": @"Red",
    } completion:^(NSError * _Nullable error) {
      if (error != nil) {
        NSLog(@"Error updating document: %@", error);
      } else {
        NSLog(@"Document successfully updated");
      }
    }];

    Kotlin+KTX

    // Assume the document contains:
    // {
    //   name: "Frank",
    //   favorites: { food: "Pizza", color: "Blue", subject: "recess" }
    //   age: 12
    // }
    //
    // To update age and favorite color:
    db.collection("users").document("frank")
        .update(
            mapOf(
                "age" to 13,
                "favorites.color" to "Red",
            ),
        )

    Java

    // Assume the document contains:
    // {
    //   name: "Frank",
    //   favorites: { food: "Pizza", color: "Blue", subject: "recess" }
    //   age: 12
    // }
    //
    // To update age and favorite color:
    db.collection("users").document("frank")
            .update(
                    "age", 13,
                    "favorites.color", "Red"
            );

    Dart

    // Assume the document contains:
    // {
    //   name: "Frank",
    //   favorites: { food: "Pizza", color: "Blue", subject: "recess" }
    //   age: 12
    // }
    db
        .collection("users")
        .doc("frank")
        .update({"age": 13, "favorites.color": "Red"});
    Java
    // Create an initial document to update
    DocumentReference frankDocRef = db.collection("users").document("frank");
    Map<String, Object> initialData = new HashMap<>();
    initialData.put("name", "Frank");
    initialData.put("age", 12);
    
    Map<String, Object> favorites = new HashMap<>();
    favorites.put("food", "Pizza");
    favorites.put("color", "Blue");
    favorites.put("subject", "Recess");
    initialData.put("favorites", favorites);
    
    ApiFuture<WriteResult> initialResult = frankDocRef.set(initialData);
    // Confirm that data has been successfully saved by blocking on the operation
    initialResult.get();
    
    // Update age and favorite color
    Map<String, Object> updates = new HashMap<>();
    updates.put("age", 13);
    updates.put("favorites.color", "Red");
    
    // Async update document
    ApiFuture<WriteResult> writeResult = frankDocRef.update(updates);
    // ...
    System.out.println("Update time : " + writeResult.get().getUpdateTime());
    Python
    # Create an initial document to update
    frank_ref = db.collection("users").document("frank")
    frank_ref.set(
        {
            "name": "Frank",
            "favorites": {"food": "Pizza", "color": "Blue", "subject": "Recess"},
            "age": 12,
        }
    )
    
    # Update age and favorite color
    frank_ref.update({"age": 13, "favorites.color": "Red"})

    Python

    # Create an initial document to update
    frank_ref = db.collection("users").document("frank")
    await frank_ref.set(
        {
            "name": "Frank",
            "favorites": {"food": "Pizza", "color": "Blue", "subject": "Recess"},
            "age": 12,
        }
    )
    
    # Update age and favorite color
    await frank_ref.update({"age": 13, "favorites.color": "Red"})
    C++
    // Assume the document contains:
    // {
    //   name: "Frank",
    //   favorites: { food: "Pizza", color: "Blue", subject: "recess" }
    //   age: 12
    // }
    //
    // To update age and favorite color:
    db->Collection("users").Document("frank").Update({
        {"age", FieldValue::Integer(13)},
        {"favorites.color", FieldValue::String("red")},
    });
    Node.js
    const initialData = {
      name: 'Frank',
      age: 12,
      favorites: {
        food: 'Pizza',
        color: 'Blue',
        subject: 'recess'
      }
    };
    
    // ...
    const res = await db.collection('users').doc('Frank').update({
      age: 13,
      'favorites.color': 'Red'
    });
    Tiến hành
    
    import (
    	"context"
    	"log"
    
    	"cloud.google.com/go/firestore"
    )
    
    func updateDocNested(ctx context.Context, client *firestore.Client) error {
    	initialData := map[string]interface{}{
    		"name": "Frank",
    		"age":  12,
    		"favorites": map[string]interface{}{
    			"food":    "Pizza",
    			"color":   "Blue",
    			"subject": "recess",
    		},
    	}
    
    	// ...
    
    	_, err := client.Collection("users").Doc("frank").Set(ctx, map[string]interface{}{
    		"age": 13,
    		"favorites": map[string]interface{}{
    			"color": "Red",
    		},
    	}, firestore.MergeAll)
    	if err != nil {
    		// Handle any errors in an appropriate way, such as returning them.
    		log.Printf("An error has occurred: %s", err)
    	}
    
    	return err
    }
    
    PHP

    PHP

    Để biết thêm thông tin về cách cài đặt và tạo ứng dụng Cloud Firestore, hãy tham khảo Thư viện ứng dụng Cloud Firestore.

    // Create an initial document to update
    $frankRef = $db->collection('samples/php/users')->document('frank');
    $frankRef->set([
        'first' => 'Frank',
        'last' => 'Franklin',
        'favorites' => ['food' => 'Pizza', 'color' => 'Blue', 'subject' => 'Recess'],
        'age' => 12
    ]);
    
    // Update age and favorite color
    $frankRef->update([
        ['path' => 'age', 'value' => 13],
        ['path' => 'favorites.color', 'value' => 'Red']
    ]);
    Unity
    DocumentReference frankDocRef = db.Collection("users").Document("frank");
    Dictionary<string, object> initialData = new Dictionary<string, object>
    {
    	{ "Name", "Frank" },
    	{ "Age", 12 }
    };
    
    Dictionary<string, object> favorites = new Dictionary<string, object>
    {
    	{ "Food", "Pizza" },
    	{ "Color", "Blue" },
    	{ "Subject", "Recess" },
    };
    initialData.Add("Favorites", favorites);
    frankDocRef.SetAsync(initialData).ContinueWithOnMainThread(task => {
    
    	// Update age and favorite color
    	Dictionary<string, object> updates = new Dictionary<string, object>
    	{
    		{ "Age", 13 },
    		{ "Favorites.Color", "Red" },
    	};
    
    	// Asynchronously update the document
    	return frankDocRef.UpdateAsync(updates);
    }).ContinueWithOnMainThread(task => {
    	Debug.Log(
    		"Updated the age and favorite color fields of the Frank document in "
    		+ "the users collection.");
    });
    C#
    DocumentReference frankDocRef = db.Collection("users").Document("frank");
    Dictionary<string, object> initialData = new Dictionary<string, object>
    {
        { "Name", "Frank" },
        { "Age", 12 }
    };
    
    Dictionary<string, object> favorites = new Dictionary<string, object>
    {
        { "Food", "Pizza" },
        { "Color", "Blue" },
        { "Subject", "Recess" },
    };
    initialData.Add("Favorites", favorites);
    await frankDocRef.SetAsync(initialData);
    
    // Update age and favorite color
    Dictionary<string, object> updates = new Dictionary<string, object>
    {
        { "Age", 13 },
        { "Favorites.Color", "Red" },
    };
    
    // Asynchronously update the document
    await frankDocRef.UpdateAsync(updates);
    Ruby
    # Create an initial document to update
    frank_ref = firestore.doc "#{collection_path}/frank"
    frank_ref.set(
      {
        name:      "Frank",
        favorites: {
          food:    "Pizza",
          color:   "Blue",
          subject: "Recess"
        },
        age:       12
      }
    )
    
    # Update age and favorite color
    frank_ref.update({ age: 13, "favorites.color": "Red" })

    Ký hiệu dấu chấm cho phép bạn cập nhật một trường lồng nhau mà không ghi đè các trường lồng nhau khác. Nếu cập nhật một trường lồng nhau mà không có ký hiệu dấu chấm, bạn sẽ ghi đè toàn bộ trường bản đồ, như trong ví dụ sau:

    Web
    // Create our initial doc
    db.collection("users").doc("frank").set({
      name: "Frank",
      favorites: {
        food: "Pizza",
        color: "Blue",
        subject: "Recess"
      },
      age: 12
    }).then(function() {
      console.log("Frank created");
    });
    
    // Update the doc without using dot notation.
    // Notice the map value for favorites.
    db.collection("users").doc("frank").update({
      favorites: {
        food: "Ice Cream"
      }
    }).then(function() {
      console.log("Frank food updated");
    });
    
    /*
    Ending State, favorite.color and favorite.subject are no longer present:
    /users
        /frank
            {
                name: "Frank",
                favorites: {
                    food: "Ice Cream",
                },
                age: 12
            }
     */

    Cập nhật các phần tử trong một mảng

    Nếu tài liệu của bạn chứa trường mảng, thì bạn có thể sử dụng arrayUnion()arrayRemove() để thêm và xoá các phần tử. arrayUnion() thêm các phần tử vào một mảng nhưng chỉ những phần tử chưa có. arrayRemove() xoá tất cả các thực thể của từng phần tử đã cho.

    Web

    import { doc, updateDoc, arrayUnion, arrayRemove } from "firebase/firestore";
    
    const washingtonRef = doc(db, "cities", "DC");
    
    // Atomically add a new region to the "regions" array field.
    await updateDoc(washingtonRef, {
        regions: arrayUnion("greater_virginia")
    });
    
    // Atomically remove a region from the "regions" array field.
    await updateDoc(washingtonRef, {
        regions: arrayRemove("east_coast")
    });

    Web

    var washingtonRef = db.collection("cities").doc("DC");
    
    // Atomically add a new region to the "regions" array field.
    washingtonRef.update({
        regions: firebase.firestore.FieldValue.arrayUnion("greater_virginia")
    });
    
    // Atomically remove a region from the "regions" array field.
    washingtonRef.update({
        regions: firebase.firestore.FieldValue.arrayRemove("east_coast")
    });
    Swift
    Lưu ý: Sản phẩm này không dùng được trên các mục tiêu watchOS và App Clip.
    let washingtonRef = db.collection("cities").document("DC")
    
    // Atomically add a new region to the "regions" array field.
    washingtonRef.updateData([
      "regions": FieldValue.arrayUnion(["greater_virginia"])
    ])
    
    // Atomically remove a region from the "regions" array field.
    washingtonRef.updateData([
      "regions": FieldValue.arrayRemove(["east_coast"])
    ])
    Objective-C
    Lưu ý: Sản phẩm này không dùng được trên các mục tiêu watchOS và App Clip.
    FIRDocumentReference *washingtonRef =
        [[self.db collectionWithPath:@"cities"] documentWithPath:@"DC"];
    
    // Atomically add a new region to the "regions" array field.
    [washingtonRef updateData:@{
      @"regions": [FIRFieldValue fieldValueForArrayUnion:@[@"greater_virginia"]]
    }];
    
    // Atomically remove a new region to the "regions" array field.
    [washingtonRef updateData:@{
      @"regions": [FIRFieldValue fieldValueForArrayRemove:@[@"east_coast"]]
    }];

    Kotlin+KTX

    val washingtonRef = db.collection("cities").document("DC")
    
    // Atomically add a new region to the "regions" array field.
    washingtonRef.update("regions", FieldValue.arrayUnion("greater_virginia"))
    
    // Atomically remove a region from the "regions" array field.
    washingtonRef.update("regions", FieldValue.arrayRemove("east_coast"))

    Java

    DocumentReference washingtonRef = db.collection("cities").document("DC");
    
    // Atomically add a new region to the "regions" array field.
    washingtonRef.update("regions", FieldValue.arrayUnion("greater_virginia"));
    
    // Atomically remove a region from the "regions" array field.
    washingtonRef.update("regions", FieldValue.arrayRemove("east_coast"));

    Dart

    final washingtonRef = db.collection("cities").doc("DC");
    
    // Atomically add a new region to the "regions" array field.
    washingtonRef.update({
      "regions": FieldValue.arrayUnion(["greater_virginia"]),
    });
    
    // Atomically remove a region from the "regions" array field.
    washingtonRef.update({
      "regions": FieldValue.arrayRemove(["east_coast"]),
    });
    Java
    DocumentReference washingtonRef = db.collection("cities").document("DC");
    
    // Atomically add a new region to the "regions" array field.
    ApiFuture<WriteResult> arrayUnion =
        washingtonRef.update("regions", FieldValue.arrayUnion("greater_virginia"));
    System.out.println("Update time : " + arrayUnion.get());
    
    // Atomically remove a region from the "regions" array field.
    ApiFuture<WriteResult> arrayRm =
        washingtonRef.update("regions", FieldValue.arrayRemove("east_coast"));
    System.out.println("Update time : " + arrayRm.get());
    Python
    city_ref = db.collection("cities").document("DC")
    
    # Atomically add a new region to the 'regions' array field.
    city_ref.update({"regions": firestore.ArrayUnion(["greater_virginia"])})
    
    # // Atomically remove a region from the 'regions' array field.
    city_ref.update({"regions": firestore.ArrayRemove(["east_coast"])})

    Python

    city_ref = db.collection("cities").document("DC")
    
    # Atomically add a new region to the 'regions' array field.
    await city_ref.update({"regions": firestore.ArrayUnion(["greater_virginia"])})
    
    # // Atomically remove a region from the 'regions' array field.
    await city_ref.update({"regions": firestore.ArrayRemove(["east_coast"])})
    C++
    // This is not yet supported.
    Node.js
    // ...
    const washingtonRef = db.collection('cities').doc('DC');
    
    // Atomically add a new region to the "regions" array field.
    const unionRes = await washingtonRef.update({
      regions: FieldValue.arrayUnion('greater_virginia')
    });
    // Atomically remove a region from the "regions" array field.
    const removeRes = await washingtonRef.update({
      regions: FieldValue.arrayRemove('east_coast')
    });
    
    // To add or remove multiple items, pass multiple arguments to arrayUnion/arrayRemove
    const multipleUnionRes = await washingtonRef.update({
      regions: FieldValue.arrayUnion('south_carolina', 'texas')
      // Alternatively, you can use spread operator in ES6 syntax
      // const newRegions = ['south_carolina', 'texas']
      // regions: FieldValue.arrayUnion(...newRegions)
    });
    Tiến hành
    // Not supported yet
    PHP

    PHP

    Để biết thêm thông tin về cách cài đặt và tạo ứng dụng Cloud Firestore, hãy tham khảo Thư viện ứng dụng Cloud Firestore.

    $cityRef = $db->collection('samples/php/cities')->document('DC');
    
    // Atomically add a new region to the "regions" array field.
    $cityRef->update([
        ['path' => 'regions', 'value' => FieldValue::arrayUnion(['greater_virginia'])]
    ]);
    
    // Atomically remove a region from the "regions" array field.
    $cityRef->update([
        ['path' => 'regions', 'value' => FieldValue::arrayRemove(['east_coast'])]
    ]);
    Unity
    // This is not yet supported in the Unity SDK
      
    C#
    DocumentReference washingtonRef = db.Collection("cities").Document("DC");
    
    // Atomically add a new region to the "regions" array field.
    await washingtonRef.UpdateAsync("Regions", FieldValue.ArrayUnion("greater_virginia"));
    
    // Atomically remove a region from the "regions" array field.
    await washingtonRef.UpdateAsync("Regions", FieldValue.ArrayRemove("east_coast"));
    Ruby
    // Not supported yet

    Tăng giá trị dạng số

    Bạn có thể tăng hoặc giảm giá trị trường dạng số như trong ví dụ sau. Thao tác tăng sẽ tăng hoặc giảm giá trị hiện tại của một trường theo số lượng nhất định.

    Web

    import { doc, updateDoc, increment } from "firebase/firestore";
    
    const washingtonRef = doc(db, "cities", "DC");
    
    // Atomically increment the population of the city by 50.
    await updateDoc(washingtonRef, {
        population: increment(50)
    });

    Web

    var washingtonRef = db.collection('cities').doc('DC');
    
    // Atomically increment the population of the city by 50.
    washingtonRef.update({
        population: firebase.firestore.FieldValue.increment(50)
    });
    Swift
    Lưu ý: Sản phẩm này không dùng được trên các mục tiêu watchOS và App Clip.
    let washingtonRef = db.collection("cities").document("DC")
    
    // Atomically increment the population of the city by 50.
    // Note that increment() with no arguments increments by 1.
    washingtonRef.updateData([
      "population": FieldValue.increment(Int64(50))
    ])
    Objective-C
    Lưu ý: Sản phẩm này không dùng được trên các mục tiêu watchOS và App Clip.
    FIRDocumentReference *washingtonRef =
        [[self.db collectionWithPath:@"cities"] documentWithPath:@"DC"];
    
    // Atomically increment the population of the city by 50.
    // Note that increment() with no arguments increments by 1.
    [washingtonRef updateData:@{
      @"population": [FIRFieldValue fieldValueForIntegerIncrement:50]
    }];

    Kotlin+KTX

    val washingtonRef = db.collection("cities").document("DC")
    
    // Atomically increment the population of the city by 50.
    washingtonRef.update("population", FieldValue.increment(50))

    Java

    DocumentReference washingtonRef = db.collection("cities").document("DC");
    
    // Atomically increment the population of the city by 50.
    washingtonRef.update("population", FieldValue.increment(50));

    Dart

    var washingtonRef = db.collection('cities').doc('DC');
    
    // Atomically increment the population of the city by 50.
    washingtonRef.update(
      {"population": FieldValue.increment(50)},
    );
    Java
    DocumentReference washingtonRef = db.collection("cities").document("DC");
    
    // Atomically increment the population of the city by 50.
    final ApiFuture<WriteResult> updateFuture =
        washingtonRef.update("population", FieldValue.increment(50));
    Python
    washington_ref = db.collection("cities").document("DC")
    
    washington_ref.update({"population": firestore.Increment(50)})

    Python

    washington_ref = db.collection("cities").document("DC")
    
    await washington_ref.update({"population": firestore.Increment(50)})
    C++
    // This is not yet supported.
    Node.js
    // ...
    const washingtonRef = db.collection('cities').doc('DC');
    
    // Atomically increment the population of the city by 50.
    const res = await washingtonRef.update({
      population: FieldValue.increment(50)
    });
    Tiến hành
    import (
    	"context"
    	"fmt"
    
    	"cloud.google.com/go/firestore"
    )
    
    // updateDocumentIncrement increments the population of the city document in the
    // cities collection by 50.
    func updateDocumentIncrement(projectID, city string) error {
    	// projectID := "my-project"
    
    	ctx := context.Background()
    
    	client, err := firestore.NewClient(ctx, projectID)
    	if err != nil {
    		return fmt.Errorf("firestore.NewClient: %w", err)
    	}
    	defer client.Close()
    
    	dc := client.Collection("cities").Doc(city)
    	_, err = dc.Update(ctx, []firestore.Update{
    		{Path: "population", Value: firestore.Increment(50)},
    	})
    	if err != nil {
    		return fmt.Errorf("Update: %w", err)
    	}
    
    	return nil
    }
    
    PHP

    PHP

    Để biết thêm thông tin về cách cài đặt và tạo ứng dụng Cloud Firestore, hãy tham khảo Thư viện ứng dụng Cloud Firestore.

    $cityRef = $db->collection('samples/php/cities')->document('DC');
    
    // Atomically increment the population of the city by 50.
    $cityRef->update([
        ['path' => 'regions', 'value' => FieldValue::increment(50)]
    ]);
    Unity
    // This is not yet supported in the Unity SDK.
      
    C#
    DocumentReference washingtonRef = db.Collection("cities").Document("DC");
    
    // Atomically increment the population of the city by 50.
    await washingtonRef.UpdateAsync("Regions", FieldValue.Increment(50));
    Ruby
    city_ref = firestore.doc "#{collection_path}/DC"
    city_ref.update({ population: firestore.field_increment(50) })

    Các toán tử tăng rất hữu ích trong việc triển khai bộ đếm. Xin lưu ý rằng việc cập nhật một tài liệu quá nhanh có thể dẫn đến xung đột hoặc lỗi. Nếu bạn cần cập nhật bộ đếm với tốc độ rất cao, hãy xem trang Bộ đếm phân tán.