Firebase向数组中添加项目
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() }] })
都没有成功。这些查询会覆盖我的数组。
答案可能很简单,但我找不到…
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,这真的很让我沮丧,我还是搞不懂。
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"。
通过使用正确的方法和参数,开发者可以轻松地添加或删除项目,以满足特定的需求。
Firebase添加项到数组的问题出现的原因是Firebase在更新数组时,只提供了添加和删除整个元素的方法,而没有提供更新特定索引的方法。解决方法是使用Firebase提供的arrayUnion()
函数,该函数可以将元素添加到数组中,但只添加不存在的元素。
具体解决方法如下:
1. 在客户端导入Firebase SDK:使用import * as firebase from 'firebase/app';
2. 使用firebase.firestore.FieldValue.arrayUnion(NEW_ELEMENT)
来将新元素添加到数组中。
然而,目前Firebase还没有提供类似arrayUnion()
的方法来更新特定id的数组项。目前的解决方法是先使用删除操作将数组项移除,然后再使用添加操作将具有新数据的数组项添加回去。