如何检查安全规则数组中的重复项?

时间:2019-11-22 23:05:40

标签: firebase google-cloud-firestore firebase-security

问题

我想确保Cloud Firestore文档中的数组字段不包含任何重复的条目,但是,我找不到任何methods in the documentation可以让我轻松检查这一点。

代码

我想出了一个可能的解决方案,可确保列表仅包含ab,并且没有重复的条目。

function containsNoDuplicates(array) {
  return array is list
         && array.size() <= 2
         && array.hasOnly(['a', 'b'])
         && (
              array.size() <= 1
              || (array.size() == 2 && array.hasAll(['a', 'b']))
            )
         ;
}

这等效于以下功能:

function containsNoDuplicates(array) {
  return array == []
         || array == ['a']           
         || array == ['b']
         || array == ['a', 'b']
         || array == ['b', 'a']
         ;
}

这些解决方案的问题

您可能会说,这可伸缩。如果我只允许说一组特定元素(例如十几个元素),我将如何处理?

1 个答案:

答案 0 :(得分:2)

安全规则中实际上有一个未记录的语言功能,该功能可让您将列表转换为新的“集合”类型的对象,该对象保证没有重复。列表中的所有重复项将在集合中折叠。这意味着您要做的就是将原始列表的大小与集合的大小进行比较,以找出是否存在重复:

function containsNoDuplicates(array) {
  return array.toSet().size() == array.size();
}