首页 > 解决方案 > 如果尚不存在如何创建数组,然后将数据附加到 Firestore 中的数组?

问题描述

参考“更新数组中的元素

我可以理解如何向现有数组添加元素。但是如果不存在,我想创建一个新数组,然后在单个 Firestore 调用中向其中添加数据。怎么做?

  1. 如果数组不存在,则不添加数据。

    .update("arrayName", FieldValue.arrayUnion("arrayData"))

  2. 如果不存在则创建一个新数组并添加数据,但数据会被覆盖而不是附加。

    .set(hashMapOf("arrayName" to arrayListOf("arrayData")), SetOptions.merge())

我想打一个Firestore电话,

  1. 如果不存在则检查数组是否存在创建新数组。
  2. 然后它检查数据是否存在于数组中,如果没有将数据添加到数组中。

是否有一个简单的解决方案,或者我们是否需要多次调用才能实现这一目标?

编辑:

我正在使用的代码:

return firebaseFirestore
  .collection("collection1")
  .document("document1")
  .collection("collection2")
  .document("document2")
  .update("arrayName", FieldValue.arrayUnion("arrayData"))

@Alex 正如您所指出的,如果不存在数组,则会创建该数组,并将数据添加到其中。发现我的问题是由于另一个问题引起的。

在我的场景中,尚未创建“collection1”、“document1”、“collection2”和“document2”。我的代码只有在要添加数组的文档(“文档”)已经创建时才有效。

你能帮我解决这个问题吗?

标签: androidfirebasekotlingoogle-cloud-firestore

解决方案


  1. 如果数组不存在,则不添加数据。

是的,它确实。根据有关 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"]

编辑:

我的代码只有在要添加数组的文档(“文档”)已经创建时才有效。

是的,这是预期的行为。您不能更新不存在的文档中的数组。为了解决这个问题,您基本上应该创建该文档,至少具有一个属性,以便它存在于该特定位置。该属性可能是一个空数组或任何其他受支持的数据类型,因为它稍后会转换为一个数组。

更合适的解决方案可能是检查文档是否存在。如果存在,请将其与所需的数组一起添加,否则,更新它。但是你不可能一次完成。


推荐阅读