android - 如果尚不存在如何创建数组,然后将数据附加到 Firestore 中的数组?
问题描述
参考“更新数组中的元素:
我可以理解如何向现有数组添加元素。但是如果不存在,我想创建一个新数组,然后在单个 Firestore 调用中向其中添加数据。怎么做?
如果数组不存在,则不添加数据。
.update("arrayName", FieldValue.arrayUnion("arrayData"))
如果不存在则创建一个新数组并添加数据,但数据会被覆盖而不是附加。
.set(hashMapOf("arrayName" to arrayListOf("arrayData")), SetOptions.merge())
我想打一个Firestore电话,
- 如果不存在则检查数组是否存在创建新数组。
- 然后它检查数据是否存在于数组中,如果没有将数据添加到数组中。
是否有一个简单的解决方案,或者我们是否需要多次调用才能实现这一目标?
编辑:
我正在使用的代码:
return firebaseFirestore
.collection("collection1")
.document("document1")
.collection("collection2")
.document("document2")
.update("arrayName", FieldValue.arrayUnion("arrayData"))
@Alex 正如您所指出的,如果不存在数组,则会创建该数组,并将数据添加到其中。发现我的问题是由于另一个问题引起的。
在我的场景中,尚未创建“collection1”、“document1”、“collection2”和“document2”。我的代码只有在要添加数组的文档(“文档”)已经创建时才有效。
你能帮我解决这个问题吗?
解决方案
- 如果数组不存在,则不添加数据。
是的,它确实。根据有关 FieldValue 的arrayUnion()方法的官方文档:
返回一个特殊值,该值可用于
set()
或update()
告诉服务器将给定元素与服务器上已存在的任何数组值联合。数组中尚不存在的每个指定元素都将添加到末尾。如果被修改的字段还不是一个数组,它将被一个包含指定元素的数组覆盖。
换句话说,如果您的arrayName
属性不是数组,您arrayData
将被添加到数组中,然后该数组将在文档中被覆盖。所以如果你arrayName
不是一个数组,它将成为一个数组。如果该属性根本不存在,将创建一个新数组并将其添加到文档中。因此,如果您的文档如下所示:
Firestore-root
|
--- firstCollection
|
--- firstDocument
|
--- docName: "Doc Name"
使用这些代码行后:
FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
DocumentReference docRef = rootRef.collection("firstCollection").document("firstCollection");
docRef.update("arrayName", FieldValue.arrayUnion("arrayData"));
您的文档将如下所示:
Firestore-root
|
--- firstCollection
|
--- firstDocument
|
--- docName: "Doc Name"
|
--- arrayName: ["arrayData"]
编辑:
我的代码只有在要添加数组的文档(“文档”)已经创建时才有效。
是的,这是预期的行为。您不能更新不存在的文档中的数组。为了解决这个问题,您基本上应该创建该文档,至少具有一个属性,以便它存在于该特定位置。该属性可能是一个空数组或任何其他受支持的数据类型,因为它稍后会转换为一个数组。
更合适的解决方案可能是检查文档是否存在。如果存在,请将其与所需的数组一起添加,否则,更新它。但是你不可能一次完成。
推荐阅读
- javascript - 致命错误:找不到“AppDelegate.h”文件#import“AppDelegate.h”
- javascript - 如果在整个 DOM 中使用相同的 div,则仅将字符串附加到特定 div 一次
- react-native - React-Native Production APK 因“babelHelpers.interopRequireDefault object is not a function”错误而崩溃
- python - 如何在后续重新绘制时删除 Matplotlib 颜色条?
- php - 对 php 的 Swift 4 Json 请求
- python - WGSI 和非 WSGI Django 应用程序的设计/编写方式是否不同?
- cmake - 在 solaris11 中安装 cmake 3.11
- android - 无法获取 imageView 的顶部和底部
- python - 值的长度与索引的长度不匹配
- python - 将 plt.hist() 用于 2500 行的数组时的性能问题