Firestore“数组包含任何”不起作用

时间:2019-12-11 15:49:50

标签: ios swift firebase google-cloud-firestore

我正在尝试对iOS(Swift)上的Firestore使用查询:

db.collection(FS_PICS)
            //.whereField("category", arrayContains: "Animals")
            .whereField("category", arrayContains: ["Animals", "Dogs"])
            .getDocuments() { (querySnapshot, err) in
                if let err = err {
                    print("Error getting documents: \(err)")
                } else {
                    for document in querySnapshot!.documents {
                        print("\(document.documentID) => \(document.data())")
                    }
                }
        }

它不会返回任何结果

// doesn't work
.whereField("category", arrayContains: ["Animals", "Dogs"])

或搭配

// doesn't work
.whereField("category", in: ["Animals", "Dogs"])

但是我有8个结果:

// It works!!
.whereField("category", arrayContains: "Animals")

它甚至不能像AND一样工作,因为它也不起作用:

// It works!!
.whereField("category", arrayContains: ["Animals"])

那么这个函数的概念是什么,我应该怎么做才能得到OR?

2 个答案:

答案 0 :(得分:3)

问题出在文档中的代码示例中。它应该是 arrayContainsAny enter image description here

对于其他语言是正确的:

enter image description here

答案 1 :(得分:2)

编辑:根据截图,文档不正确,您是对的。无论如何,都需要进行一些澄清:

这是错误的:

.whereField("category", arrayContains: ["Animals", "Dogs"])

arrayContains必须输入该数组包含的单一类型(即,字符串数组输入一个字符串),而不是集合。 arrayContains不执行“或”或“与”运算,它仅执行与数组内元素的单个实例相等的操作。

这是正确的:

.whereField("category", arrayContains: "Dogs")

这也是正确的:

.whereField("category", arrayContainsAny: ["Animals", "Dogs"])

arrayContainsAny查询执行OR操作,其中category必须包含“动物”或“狗”。

为了进行度量,还有in可以对非集合(即非数组)字段执行“或”运算。如果“类别”字段只是一个String(而不是Array),则可以使用以下命令执行OR查询:

.whereField("category", in: ["Animals", "Dogs"])