您可以通过几种方式将数据写入 Firestore:
- 在集合中设置文档的数据,并明确指定一个文档标识符。
- 向集合添加新文档。在这种情况下,Firestore 会自动生成文档标识符。
- 创建一个使用自动生成的标识符的空文档,并在以后向该文档分配数据。
本指南介绍了如何在 Firestore 中使用 set、add 或 update 方法来设置、添加或更新单个文档。如果要批量写入数据,请参阅事务和批量写入。
设置文档
要创建或覆盖单个文档,请使用 set()
方法:
Web
// 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
// Add a new document in collection "cities" db.collection("cities").document("LA").setData([ "name": "Los Angeles", "state": "CA", "country": "USA" ]) { err in if let err = err { print("Error writing document: \(err)") } else { print("Document successfully written!") } }
Objective-C
// 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!"); } }];
Java
Android
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); } });
Kotlin+KTX
Android
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
// 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
data = { u'name': u'Los Angeles', u'state': u'CA', u'country': u'USA' } # Add a new doc in collection 'cities' with ID 'LA' db.collection(u'cities').document(u'LA').set(data)
C++
// 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!\n"; } else { std::cout << "Error writing document: " << future.error_message() << '\n'; } });
Node.js
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);
Go
_, 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) }
PHP
$data = [ 'name' => 'Los Angeles', 'state' => 'CA', 'country' => 'USA' ]; $db->collection('cities')->document('LA')->set($data);
Unity
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#
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
city_ref = firestore.doc "#{collection_path}/LA" data = { name: "Los Angeles", state: "CA", country: "USA" } city_ref.set data
如果文档不存在,系统将会创建一个。如果文档存在,其内容将被新提供的数据覆盖,除非您指定应将该数据合并到现有文档中,如下所示:
Web
var cityRef = db.collection('cities').doc('BJ'); var setWithMerge = cityRef.set({ capital: true }, { merge: true });
Swift
// Update one field, creating the document if it does not exist. db.collection("cities").document("BJ").setData([ "capital": true ], merge: true)
Objective-C
// 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) { // ... }];
Java
Android
// 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());
Kotlin+KTX
Android
// 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
//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(u'cities').document(u'BJ') city_ref.set({ u'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 });
Go
_, 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) }
PHP
$cityRef = $db->collection('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)
如果您不确定文档是否存在,请传递一个将新数据与任何现有文档合并的选项,以避免覆盖整个文档。
数据类型
Firestore 允许您在文档中写入各种类型的数据,包括字符串、布尔值、数字、日期、null 以及嵌套的数组和对象。无论您在代码中使用哪种类型的数字,Firestore 都会将数字存储为双精度型数字。
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
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" ] ] ] db.collection("data").document("one").setData(docData) { err in if let err = err { print("Error writing document: \(err)") } else { print("Document successfully written!") } }
Objective-C
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!"); } }];
Java
Android
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); } });
Kotlin+KTX
Android
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", 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 = { u'stringExample': u'Hello, World!', u'booleanExample': True, u'numberExample': 3.14159265, u'dateExample': datetime.datetime.now(), u'arrayExample': [5, True, u'hello'], u'nullExample': None, u'objectExample': { u'a': 5, u'b': True } } db.collection(u'data').document(u'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!\n"; } else { std::cout << "Error writing document: " << future.error_message() << '\n'; } });
Node.js
const data = { stringExample: 'Hello, World!', booleanExample: true, numberExample: 3.14159265, dateExample: admin.firestore.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);
Go
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) }
PHP
$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('data')->document('two'), ]; $db->collection('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 }, }; ArrayList arrayExample = new ArrayList(); arrayExample.Add(5); arrayExample.Add(true); arrayExample.Add("Hello"); docData.Add("arrayExample", arrayExample); Dictionary<string, object> objectExample = new Dictionary<string, object> { { "a", 5 }, { "b", true }, }; docData.Add("objectExample", objectExample); 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
自定义对象
使用 Map
或 Dictionary
对象来表示文档通常不是很方便,因此 Firestore 支持使用自定义类写入文档。Firestore 会将对象转换为受支持的数据类型。
使用自定义类,您可以重写初始示例,如下所示:
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
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
// This isn't supported in Objective-C.
Java
Android
每个自定义类都必须有一个不接受任何参数的公共构造函数。此外,类必须为每个属性包含一个公共 getter。
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; } }
Kotlin+KTX
Android
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
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(object): 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
Go
// 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"` Regions []string `firestore:"regions,omitempty"` }
PHP
// This isn't supported in PHP
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
// Set with cityConverter db.collection("cities").doc("LA") .withConverter(cityConverter) .set(new City("Los Angeles", "CA", "USA"));
Swift
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
// This isn't supported in Objective-C.
Java
Android
City city = new City("Los Angeles", "CA", "USA", false, 5000000L, Arrays.asList("west_coast", "sorcal")); db.collection("cities").document("LA").set(city);
Kotlin+KTX
Android
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, 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=u'Los Angeles', state=u'CA', country=u'USA') db.collection(u'cities').document(u'LA').set(city.to_dict())
C++
// This is not yet supported.
Node.js
// Node.js uses JavaScript objects
Go
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) }
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.
添加文档
当您使用 set()
创建文档时,必须为要创建的文档指定 ID。例如:
Web
db.collection("cities").doc("new-city-id").set(data);
Swift
db.collection("cities").document("new-city-id").setData(data)
Objective-C
[[[self.db collectionWithPath:@"cities"] documentWithPath:@"new-city-id"] setData:data];
Java
Android
db.collection("cities").document("new-city-id").set(data);
Kotlin+KTX
Android
db.collection("cities").document("new-city-id").set(data)
Java
db.collection("cities").document("new-city-id").set(data);
Python
db.collection(u'cities').document(u'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);
Go
_, 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) }
PHP
$db->collection('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
如果有时无法为文档指定有意义的 ID,让 Firestore 为您自动生成 ID 会比较方便。您可以通过调用 add()
来实现此目的:
Web
// 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
// Add a new document with a generated id. var ref: DocumentReference? = nil ref = db.collection("cities").addDocument(data: [ "name": "Tokyo", "country": "Japan" ]) { err in if let err = err { print("Error adding document: \(err)") } else { print("Document added with ID: \(ref!.documentID)") } }
Objective-C
// 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); } }];
Java
Android
// 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); } });
Kotlin+KTX
Android
// 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
// 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
city = City(name=u'Tokyo', state=None, country=u'Japan') db.collection(u'cities').add(city.to_dict())
C++
db->Collection("cities").Add({/*some data*/});
Node.js
// 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);
Go
_, _, 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) }
PHP
$data = [ 'name' => 'Tokyo', 'country' => 'Japan' ]; $addedDocRef = $db->collection('cities')->add($data); printf('Added document with ID: %s' . PHP_EOL, $addedDocRef->id());
Unity
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#
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
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}."
在某些情况下,您可以创建含自动生成的 ID 的文档引用,并在以后使用该引用。对于此用例,您可以调用 doc()
:
Web
// Add a new document with a generated id. var newCityRef = db.collection("cities").doc(); // later... newCityRef.set(data);
Swift
let newCityRef = db.collection("cities").document() // later... newCityRef.setData([ // ... ])
Objective-C
FIRDocumentReference *newCityRef = [[self.db collectionWithPath:@"cities"] documentWithAutoID]; // later... [newCityRef setData:@{ /* ... */ }];
Java
Android
Map<String, Object> data = new HashMap<>(); DocumentReference newCityRef = db.collection("cities").document(); // Later... newCityRef.set(data);
Kotlin+KTX
Android
val data = HashMap<String, Any>() val newCityRef = db.collection("cities").document() // 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(u'cities').document() # later... 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({ // ... });
Go
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) }
PHP
$addedDocRef = $db->collection('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
.add(...)
和 .doc().set(...)
在“后台”的工作原理完全相同,您可以视方便程度择一使用。
更新文档
要更新文档的某些字段而不覆盖整个文档,请使用 update()
方法:
Web
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
let washingtonRef = db.collection("cities").document("DC") // Set the "capital" field of the city 'DC' washingtonRef.updateData([ "capital": true ]) { err in if let err = err { print("Error updating document: \(err)") } else { print("Document successfully updated") } }
Objective-C
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"); } }];
Java
Android
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); } });
Kotlin+KTX
Android
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
// 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
city_ref = db.collection(u'cities').document(u'DC') # Set the capital field city_ref.update({u'capital': True})
C++
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
const cityRef = db.collection('cities').doc('DC'); // Set the 'capital' field of the city const res = await cityRef.update({capital: true});
Go
_, 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) }
PHP
$cityRef = $db->collection('cities')->document('DC'); $cityRef->update([ ['path' => 'capital', 'value' => true] ]);
Unity
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#
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
city_ref = firestore.doc "#{collection_path}/DC" city_ref.update capital: true
服务器时间戳
您可以将文档中的字段设置为服务器时间戳,以跟踪服务器何时接收更新。
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
db.collection("objects").document("some-id").updateData([ "lastUpdated": FieldValue.serverTimestamp(), ]) { err in if let err = err { print("Error updating document: \(err)") } else { print("Document successfully updated") } }
Objective-C
[[[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"); } }];
Java
Android
// 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>() { // ... // ...
Kotlin+KTX
Android
// 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
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(u'objects').document(u'some-id') city_ref.update({ u'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
// Get the `FieldValue` object const FieldValue = admin.firestore.FieldValue; // 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() });
Go
_, 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) }
PHP
$docRef = $db->collection('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
更新嵌套对象中的字段
如果您的文档包含嵌套对象,可以在调用 update()
时使用“点表示法”来引用文档中的嵌套字段:
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
// Create an initial document to update. let frankDocRef = db.collection("users").document("frank") frankDocRef.setData([ "name": "Frank", "favorites": [ "food": "Pizza", "color": "Blue", "subject": "recess" ], "age": 12 ]) // To update age and favorite color: db.collection("users").document("frank").updateData([ "age": 13, "favorites.color": "Red" ]) { err in if let err = err { print("Error updating document: \(err)") } else { print("Document successfully updated") } }
Objective-C
// 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"); } }];
Java
Android
// 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" );
Kotlin+KTX
Android
// 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
// 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(u'users').document(u'frank') frank_ref.set({ u'name': u'Frank', u'favorites': { u'food': u'Pizza', u'color': u'Blue', u'subject': u'Recess' }, u'age': 12 }) # Update age and favorite color frank_ref.update({ u'age': 13, u'favorites.color': u'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' });
Go
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) }
PHP
// Create an initial document to update $frankRef = $db->collection('users')->document('frank'); $frankRef->set([ 'name' => 'Frank', '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"
借助点表示法,您可以更新单个嵌套字段,而不覆盖其他嵌套字段。如果您在不使用点表示法的情况下更新嵌套字段,将覆盖整个映射字段,例如:
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 } */
更新数组中的元素
如果文档包含数组字段,您可以使用 arrayUnion()
和 arrayRemove()
添加和移除元素。arrayUnion()
可用于向数组添加元素,但只能添加不存在的元素。arrayRemove()
可用于删除每个指定元素的所有实例。
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
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
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"]] }];
Java
Android
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"));
Kotlin+KTX
Android
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. 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(u'cities').document(u'DC') # Atomically add a new region to the 'regions' array field. city_ref.update({u'regions': firestore.ArrayUnion([u'greater_virginia'])}) # // Atomically remove a region from the 'regions' array field. city_ref.update({u'regions': firestore.ArrayRemove([u'east_coast'])})
C++
// This is not yet supported.
Node.js
const admin = require('firebase-admin'); // ... const washingtonRef = db.collection('cities').doc('DC'); // Atomically add a new region to the "regions" array field. const unionRes = await washingtonRef.update({ regions: admin.firestore.FieldValue.arrayUnion('greater_virginia') }); // Atomically remove a region from the "regions" array field. const removeRes = await washingtonRef.update({ regions: admin.firestore.FieldValue.arrayRemove('east_coast') });
Go
// Not supported yet
PHP
$cityRef = $db->collection('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
递增数值
您可以递增或递减数字字段值,如以下示例所示。递增或递减操作会在字段的当前值基础上增加或减少给定数量。如果该字段不存在或者当前字段值不是数值,则相应操作会将该字段设置为给定值。
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
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
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] }];
Java
Android
DocumentReference washingtonRef = db.collection("cities").document("DC"); // Atomically increment the population of the city by 50. washingtonRef.update("population", FieldValue.increment(50));
Kotlin+KTX
Android
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. final ApiFuture<WriteResult> updateFuture = washingtonRef .update("population", FieldValue.increment(50));
Python
washington_ref = db.collection(u'cities').document(u'DC') washington_ref.update({"population": firestore.Increment(50)})
C++
// This is not yet supported.
Node.js
const admin = require('firebase-admin'); // ... const washingtonRef = db.collection('cities').doc('DC'); // Atomically increment the population of the city by 50. const res = await washingtonRef.update({ population: admin.firestore.FieldValue.increment(50) });
Go
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: %v", err) } 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: %v", err) } return nil }
PHP
$cityRef = $db->collection('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)
递增操作对于实现计数器非常有用,但请记住,单个文档每秒钟只能更新一次。如果您需要以更高速率更新计数器,请参阅分布式计数器页面。