Firestore 只更新一个字段

Posted

技术标签:

【中文标题】Firestore 只更新一个字段【英文标题】:Firestore update only one field 【发布时间】:2018-05-25 23:50:29 【问题描述】:

我有一个数据库。顺序是:集合 - 文档 - 哈希图。例如:

users - 集合的名称

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

我做错了什么?

【问题讨论】:

您介意显示用户文档的结构,即:它们有哪些字段和哪些键? 【参考方案1】:

我知道这是近一年的问题,但这可能会对某人有所帮助。使用dot notation

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

【讨论】:

也许我错了,但不应该是这样的: db.collection("users").document("frank").update( "age": 13, "收藏夹.color": "红色" ); 请原谅这个愚蠢的问题——但现在有没有办法在 Java 中使用这种映射语法?或者这只是答案的简写。 您必须创建一个地图,其中包含要在文档中更新的数据【参考方案2】:

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

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

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

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

【讨论】:

它不起作用。因为我在 HashMap 中发送领域对象而不是对象。当我尝试放置它时,我看到了错误。 你得到什么错误?还要确保您的问题包含您遇到的实际问题,因为现在它使用HashMap,而刚才您提到了一个领域对象。 我的 HashMap 看起来像 HashMap 这就是为什么当我尝试将它们放入更新方法时我看到有关类型不正确的错误,但如果我使用 set 方法一切正常 我不确定RealmObject 的外观如何,但这些问题可能是相关的:***.com/search?q=%5Bfirebase%5D+RealmObject 它只涉及 Firestore。我使用 Firebase 做了同样的事情,没有任何问题。但是 Firestore 需要另一个数据结构,这就是为什么我对更新方法有问题。目前我创建了一个新结构(这个结构有点多余)并且更新工作完美。我在主帖中找不到如何对结构使用更新。【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

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

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

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

.update(键、值、附加键、附加值)

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

【讨论】:

【参考方案5】:

动态嵌套引用:

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

【讨论】:

以上是关于Firestore 只更新一个字段的主要内容,如果未能解决你的问题,请参考以下文章

更新 Firestore 数据库中文档的字段

如何在 Firestore 中一次创建/更新多个文档

更新 Firestore 中 Array 的 Map 数据 - Flutter

使用python在Firestore中运行GeoPoint

如何从 pub 子函数更新 Firestore 字段

如何使用flutter更新firestore中所有文档的单个字段?