Firebase向数组中添加项目

11 浏览
0 Comments

Firebase向数组中添加项目

我目前正在尝试使用Firestore,却卡在一个非常简单的问题上:“更新数组(也称为子文档)”。

我的数据库结构非常简单。例如:

proprietary: "John Doe",

sharedWith:

[

{who: "first@test.com", when:timestamp},

{who: "another@test.com", when:timestamp},

],

我试图(但未成功)向sharedWith对象数组中添加新记录。

我尝试过:

// 使用SET
firebase.firestore()
.collection('proprietary')
.doc(docID)
.set(
  { sharedWith: [{ who: "third@test.com", when: new Date() }] },
  { merge: true }
)
// 使用UPDATE
firebase.firestore()
.collection('proprietary')
.doc(docID)
.update({ sharedWith: [{ who: "third@test.com", when: new Date() }] })

都没有成功。这些查询会覆盖我的数组。

答案可能很简单,但我找不到…

0
0 Comments

Firebase添加项目到数组的问题出现的原因是在Cloud Firestore中,目前没有一种方法可以更新单个数组元素(或添加/删除单个元素)。

解决方法有两个选项:

选项1 - 设置整个数组:

使用set()方法设置整个数组的内容,这将需要先从数据库中读取当前数据。如果您担心并发更新,可以在事务中完成所有操作。

选项2 - 使用子集合:

sharedWith作为主文档的子集合,然后添加单个项目的方法如下:

firebase.firestore()
  .collection('proprietary')
  .doc(docID)
  .collection('sharedWith')
  .add({ who: "third.com", when: new Date() })

当然,这也带来了一些限制。您将无法根据共享文档的对象进行查询,也无法在单个操作中获取文档和所有sharedWith数据。

Doug的回答指出这个问题已经解决了。可以使用arrayUnion方法。

参考链接:https://stackoverflow.com/a/51794212/324977

虽然这很令人沮丧,但还是谢谢你让我知道我没疯。

这是一个很大的缺点,Google应该尽快解决它。

请查看我的问题:https://stackoverflow.com/questions/73427668?noredirect=1#comment129679860_73427668,这真的很让我沮丧,我还是搞不懂。

0
0 Comments

Firebase添加项到数组的问题可能出现的原因是在更新文档时,使用了错误的方法或参数导致无法正确地将项添加到数组中。解决这个问题的方法是使用Firestore的FieldValue.arrayUnion方法来添加项到数组中。

在给定的示例代码中,使用了FieldValue.arrayUnion方法来将字符串"greater_virginia"添加到名为"regions"的数组字段中。这个方法是原子性的,意味着它可以确保在多个客户端同时更新同一个文档时,操作是安全的并且不会导致数据冲突。

另外,示例代码还展示了如何使用FieldValue.arrayRemove方法从数组字段中删除特定的项。在这个例子中,使用这个方法来从"regions"数组中移除字符串"east_coast"。

通过使用正确的方法和参数,开发者可以轻松地将项添加到Firebase的数组字段中,同时确保数据的一致性和完整性。

完整代码如下所示:

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")
});

这个示例代码演示了如何使用FieldValue.arrayUnion方法将字符串"greater_virginia"添加到现有的"regions"数组中,并使用FieldValue.arrayRemove方法从数组中删除字符串"east_coast"。

通过使用正确的方法和参数,开发者可以轻松地添加或删除项目,以满足特定的需求。

0
0 Comments

Firebase添加项到数组的问题出现的原因是Firebase在更新数组时,只提供了添加和删除整个元素的方法,而没有提供更新特定索引的方法。解决方法是使用Firebase提供的arrayUnion()函数,该函数可以将元素添加到数组中,但只添加不存在的元素。

具体解决方法如下:

1. 在客户端导入Firebase SDK:使用import * as firebase from 'firebase/app';

2. 使用firebase.firestore.FieldValue.arrayUnion(NEW_ELEMENT)来将新元素添加到数组中。

然而,目前Firebase还没有提供类似arrayUnion()的方法来更新特定id的数组项。目前的解决方法是先使用删除操作将数组项移除,然后再使用添加操作将具有新数据的数组项添加回去。

0