如何在Firebase中设置“主键”?

3

这是我为我的留言板应用所拟定的架构,用户可以创建自己的留言板:

{
    "boards" : {
        "jane-board" : {
            // meta information like who created this board
        },
        "john-board" : {
            // meta information like who created this board
        },
        ...
    },
    "jane-board" : {
        // data
    },
    "john-board" : {
        // data
    }
}  

如何确保“boards”不包含两个“jane-board”?

我尝试编写规则,但它失败了:

{
    "rules" : {
        ".read" : true,
        "boards" : {
            ".write" : true,
            "$board_name" : {
                ".validate" : "!newData.parent().hasChild($board_name)"
            }
        }
    }
}  

如果这不是您的用例,请编辑您的问题以包括一个允许但不应该出现的写操作的代码示例。您还可以利用这个机会将“它失败了”改成更具体的东西,比如“此代码执行了A。我希望此代码执行B”。 - Frank van Puffelen
1个回答

2

由于您正在使用板的名称作为存储它的键,因此已经保证每个板名称最多只能存在一次。

不完全清楚您试图实现什么。但是,如果您想防止覆盖板的数据,可以通过以下方式实现:

{
    "rules" : {
        ".read" : true,
        "boards" : {
            "$board_name" : {
                ".write" : "!data.parent().hasChild($board_name)"
            }
        }
    }
}  

您的规则更改如下:

  • 我从boards中删除了".write": true。如果有这个规则,所有人都可以读取所有的板子,因为您无法在较低级别上撤销权限
  • 我将规则更改为".write"规则,因为它更像是防止写入而不是验证结构。
  • 我检查新板子是否已经存在于当前数据中。您之前在newData中进行检查,但这没有任何意义:新的板子始终存在于新数据中。

好的,“board_name”类似于用户名。先到先得。因此,如果Jane创建了“jane_board”,John后续尝试创建“jane_board”的任何尝试都应该失败 :) - An SO User
以上规则将实现此目的。请注意,它们还将防止Jane和John对他们创建的任何板进行任何编辑。 - Frank van Puffelen
稍微挖掘一下,我发现可以通过使用 curl -X PATCH 并传递整个板块 JSON 对象来实现这一点。或者通过在 JavaScript API 中使用 set()".validate" : "!data.parent().hasChild($board_name)" 结合使用。 - An SO User

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接