【问题标题】:How to remove multiple elements from a Firestore Array dynamically?如何动态地从 Firestore 数组中删除多个元素?
【发布时间】:2021-04-09 08:19:48
【问题描述】:

我想从我的 Firestore 数组中删除多个元素:

var eliminatedThisRound = []

for (const player in players){
    if (players[player].eliminated === false && players[player].answer !== answer) {
        eliminatedThisRound.push(players[player].uid);
    }
}
var update = {
    roundFinished: true,
    nextRound: date.valueOf() + 12000,seconds
    players: updatedPlayers,
    remainingPlayers: admin.firestore.FieldValue.arrayRemove(eliminatedThisRound)
}
await t.update(gameRef, update);

以上返回此错误:

transaction failure: Error: Element at index 0 is not a valid array element. Nested arrays are not supported. 

所以如果我知道这些值就好了,因为我可以这样做:

remainingPlayers: admin.firestore.FieldValue.arrayRemove("player1", "player2")

但是我还没有找到使arrayRemove()的参数动态化的方法。

有什么想法吗?

【问题讨论】:

  • 据我所知,您应该能够为arrayRemove 传递多个值:firebase.google.com/docs/reference/js/…firebase.google.com/docs/reference/js/…。当你传递多个值时会发生什么?有错误信息吗?
  • 是的,没错——但我的价值观是动态的。我试图传入一个包含多个值的数组(上面的代码中的eliminatedThisRound) - 但是它返回了这个错误:Element at index 0 is not a valid array element. Nested arrays are not supported.
  • 啊,那条错误信息是有道理的(请在以后立即包含该信息)。 Renaud 答案中的扩展运算符应该使该错误消失。

标签: node.js firebase google-cloud-platform google-cloud-firestore google-cloud-functions


【解决方案1】:

您可以将单个值或一组值从这样的变量传递给arrayRemove()

var removingPlayersId = ['player1', 'player2'];
  admin
    .firestore()
    .doc('game/someID')
    .set(
      {
        remainingPlayers: admin.firestore.FieldValue.arrayRemove(
          removingPlayersId
        ),
      },
      { merge: true }
    );

【讨论】:

    【解决方案2】:

    您需要使用Spread operator,如下所示,以便将eliminatedThisRound 的所有元素作为参数传递给arrayRemove() 方法。

    var eliminatedThisRound = []
    
    for (const player in players){
        if (players[player].eliminated === false && players[player].answer !== answer) {
            eliminatedThisRound.push(players[player].uid);
        }
    }
    var update = {
    
        // ...
    
        admin.firestore.FieldValue.arrayRemove(...eliminatedThisRound)
    }
    
    await t.update(gameRef, update);
    

    请注意,您应该在 Array 中至少有一个元素,否则您将使用 0 个参数调用 arrayRemove(),而它至少需要 1 个参数。因此,您可以在将remainingPlayers 属性分配给update 对象之前检查数组长度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-21
      • 1970-01-01
      • 2022-03-19
      • 1970-01-01
      • 1970-01-01
      • 2016-07-31
      • 1970-01-01
      相关资源
      最近更新 更多