Firestore仅更新一个字段

时间:2017-12-12 10:20:16

标签: android firebase google-cloud-firestore

我有一个数据库。序列是:collections - document - hashmaps。例如:

用户 - 集合的名称

users.uid - 文档名称

Hashmap文档由很多hashmaps用户数据组成 哈希映射 哈希映射 等

Hashmap:用户名是密钥,电话,位置等是值。我只需为一个用户名更新一个字段(位置),但无法理解这是怎么做的?

我尝试了下一种方式(更新alex的电话号码):

User user = new User();
user.setPhone(131902331);

Map<String,RealmObject> userMap = new HashMap<>();
userMap.put("alex",user);

          mFirebaseFirestore
                  .collection("users")
                  .document(mFirebaseAuth.getUid())
                  .set(userMap, SetOptions.merge())
                  .addOnSuccessListener(new OnSuccessListener<Void>() {
                      @Override
                      public void onSuccess(Void aVoid) {
                          LOG.info("Success");
                      }
                  })
                  .addOnFailureListener(new OnFailureListener() {
                      @Override
                      public void onFailure(@NonNull Exception e) {
                          LOG.error("Failure "+e.toString());
                      }
                  });

我做错了什么?

5 个答案:

答案 0 :(得分:18)

当您在文档上调用set()时,该文档的现有内容将替换为您传入的数据。

如果您只想更新在地图中指定的字段的值,请使用update()

mFirebaseFirestore
  .collection("users")
  .document(mFirebaseAuth.getUid())
  .update(userMap)

请参阅updating a document上的Firestore文档。

答案 1 :(得分:9)

我知道这个问题已经存在将近一年了,但这可能会对某人有所帮助。使用dot notation

db.collection("users").document("frank").update(
    "age", 13,
    "favorites.color", "Red"
);

答案 2 :(得分:5)

请注意,从 2021 年开始,如果使用 firebase-firestore-ktx (MrAleister's answer),see documentation 中的语法已经发生了一些变化。我没有编辑答案,因为它可能对使用其他版本库的人仍然有效。

// 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"
        ))

答案 3 :(得分:1)

我在其中一些答案中发现了一些奇怪的符号。也许 firestore 参数已更新?无论如何,我想发布我自己的答案。

如果要更新文档中的单个元素,请使用以下代码:

db.collection("users").document("frank")
  .update("age", 13);

update() 参数接受您需要的任意数量的键/值对,这些键/值对不以冒号分隔,并且不会放入某种数组符号 { } 中,如其中一些答案所示。它们只是简单地添加并用逗号分隔。见下文:

.update( key , value , additionalkey, additionalvalue)

update() 之后,可以根据需要随意添加 OnSuccess/OnFailure 侦听器。

答案 4 :(得分:0)

动态嵌套参考:

def nest_update(new, parent):
    return {parent+'.'+new: val for new, val in list(new.items())}

用法:

old = {'nested': {'a': 123,'b': 456, 'c': 789}}
new = {'b': 0}
    
print('\nOld:           ', old)
print('New:           ', nest_update(new, 'nested'))
print('New should be: ', {'nested.b': 0})


# OUTPUT
Old:            {'nested': {'a': 123, 'b': 456, 'c': 789}}
New:            {'nested.b': 0}
New should be:  {'nested.b': 0}