Firestore 不合并特定的地图字段

Posted

技术标签:

【中文标题】Firestore 不合并特定的地图字段【英文标题】:Firestore do not merge specific map field 【发布时间】:2021-06-23 09:56:45 【问题描述】:

我有一个PUT: /users 端点,它接受多个字段。 在大多数情况下,我只想在带有merge: true 的文档上调用.set,以便能够更新单个文档字段而无需删除其他字段。但在另一种情况下,我将更新地图以使其中只有一个值。

例如:

// user doc
displayName: 'Frank'
age: 28
gender: 
  male: true

orientation: 
  female: true

displayNameage 可以合并,但是当涉及到 genderorientation 时,我想用新的地图完全替换地图。我知道我可以拥有gender: 'male' 的属性,但这不允许可扩展的查询,因为我正在构建一个约会应用程序并且需要有一个尽可能灵活的查询库。

现在说我要打电话给...doc.set( gender: female: true , merge: true); 我的文档结构如下所示:

displayName: 'Frank'
age: 28
gender: 
  male: true,
  female: true,

orientation: 
  female: true

但理想情况下,它会完全替换 gender 地图。即

displayName: 'Frank'
age: 28
gender: 
  female: true

orientation: 
  female: true

有人有这方面的经验吗?同样,我想将此结构保留为 Map,以便我可以运行类似的查询

db
  .collection('users')
  .where(`gender.$myOrientation`, '==', true)
  .where('gender.all', '==', true) <-- for non-gender-specific users

我也知道 array 结构,但 firestore-queries 仅限于每个查询 1 个数组查询。

谢谢!

【问题讨论】:

【参考方案1】:

使用更新而不是合并设置不是更好吗? 使用这个:

      var userDoc = db.collection('users').doc(docId);
      userDoc.update( gender: female: true );

你会得到你需要的确切结果。

Here 有一个 Stack Overflow 线程解释了在 Cloud Firestore 中使用 update 或 set with merge 之间的区别。在一个答案中,还有一个关于合并的示例:嵌套字段中的真实行为。

【讨论】:

以上是关于Firestore 不合并特定的地图字段的主要内容,如果未能解决你的问题,请参考以下文章

使用 Swift (Firestore) 访问特定文档字段

Firestore - 听特定的字段变化?

我在我的 Firestore DB 文档中添加了一个地图作为一个字段,里面有一个子字段,我的 RecyclerView 遇到了问题

Firestore - 从文档中获取特定字段

获取具有等于flutter中特定字符串的字段的Firestore文档

如何在 Swift 中从 Cloud FireStore Firebase 访问特定字段