【问题标题】:Adding already represented value in arraylist into arraylist将arraylist中已经表示的值添加到arraylist中
【发布时间】:2019-02-11 14:42:29
【问题描述】:

我正在使用 Firebase 的 Firestore。我正在使用 ArrayList。我在几个 ArrayLists 中保存了很多数字。但现在我遇到了一个问题,我无法在 ArrayList 中保存一个数字两次。
然后我在描述的地方找到了这个(文档):https://firebase.google.com/docs/firestore/manage-data/add-data
“arrayUnion() 将元素添加到数组中,但只添加不存在的元素”

真的没有办法在 Firestore 的 ArrayList 中保存一个数字两次或更多次吗?

但有趣的是,我可以在仪表板上添加值,但用户不能通过代码添加。

编辑:
我将这样的数字添加到 ArrayList:

gradesRef.onSnapshot((doc) => {
          gradesRef.update({
            [grade_type]: firebase.firestore.FieldValue.arrayUnion(grade)
          });
        });

【问题讨论】:

    标签: javascript firebase google-cloud-firestore


    【解决方案1】:

    在 JSON 和大多数编程语言中,一个数组可以包含多次相同的值。

    但许多开发人员使用数组来实现数学集,它们是唯一值的集合。这意味着在大多数编程语言中,您最终会在许多地方进行此操作。以 JavaScript 为例:

    if (!array.contains("my new value")) {
      array.push("my new value");
    }
    

    您现在有两条语句来完成一项操作,这会导致竞争条件(尤其是在多用户场景中)。

    出于这个原因,Cloud Firestore 添加了一个原子操作array-union,该操作将一个项目添加到一个数组中(如果它还没有)。如果你想在你的数组中有唯一的值,你应该使用这个操作。

    如果您不希望数组中的值是唯一的,则应使用编程语言的普通数组运算符。在 JavaScript 中,这只是我们上面使用的 push() 操作,但周围没有 if

    array.push("my new value");
    

    更新基于您的代码示例。

    gradesRef.get().then((doc) => {
        let grades = doc.data()[grade_type] || [];
        grades.push(grade);
        gradesRef.update({
            [grade_type]: grades
        });
    });
    

    所以:

    1. 从文档中获取现有的等级数组
    2. 将新项目添加到数组的末尾
    3. 将更新后的成绩写回数据库。

    【讨论】:

    • 你能看看我的编辑并告诉我如何重写它才能工作吗?
    • 您仍在使用arrayUnion。我用示例更新了我的答案。
    • 当使用此代码时,我遇到以下问题:我的 ArrayList 只有一个数字。 8 号。然后我想用你的代码再次添加 8 号。我预计在 ArrayList 中应该有两倍的 8。但是那里有很多八。见这里:dropbox.com/s/awx6dg1fjl38u5a/tt.PNG?dl=0
    • 啊,是的,那是因为您使用的是onSnapshot。因此,每次更新文档时,都会触发相同的onSnapshot,从而导致另一次更新。您可能想使用get()。请注意,如果您在调试器中运行代码并检查发生了什么,则最容易解决此类问题。
    【解决方案2】:

    为什么要添加两次相同的数据?

    如果确实不同的数据恰好具有相同的值,请考虑创建一个包含唯一 id 和值的对象,并添加一个包含具有新 id 的重复值的新对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-30
      • 1970-01-01
      • 2021-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多