【问题标题】:How to create array if not already present and then append data to the array in Firestore?如果尚不存在如何创建数组,然后将数据附加到 Firestore 中的数组?
【发布时间】:2020-11-29 19:02:39
【问题描述】:

参考"Update elements in an array

我能理解如何将元素添加到现有数组。但是如果不存在,我想创建一个新数组,然后在单个 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”尚未创建。我的代码只有在要添加数组的文档(“文档”)已经创建时才有效。

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

【问题讨论】:

    标签: android firebase kotlin google-cloud-firestore


    【解决方案1】:
    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"]
    

    编辑:

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

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

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

    【讨论】:

    • 已编辑我的问题。你能检查一下吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-25
    • 1970-01-01
    • 2013-09-03
    • 2016-09-01
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    相关资源
    最近更新 更多