【问题标题】:Firestore "array-contains-any" not workingFirestore“array-contains-any”不起作用
【发布时间】:2020-04-04 22:52:51
【问题描述】:

我正在尝试在 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")

它不像 OR 甚至不像 AND 那样工作,因为它也不工作:

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

那么这个函数的思路是什么,我该怎么做才能得到 OR 呢?

【问题讨论】:

  • 如果返回文档:.whereField("category", arrayContains: "Animals"),那么我完全希望它返回至少相同的文档,也许更多:.whereField("category", in: ["Animals", "Dogs"])。您确定 in 查询没有返回您期望的结果吗?
  • 我认为这是 Google 文档中的错误。对于[...],它应该是“arrayContainsAny”而不是“arrayContains”
  • @DougStevenson "in" 不返回任何内容。但是 arrayContainsAny: ["Animals"] - 返回相同的结果。
  • 您可以单击文档中的代码示例文件的名称并提交拉取请求以修复它。您也可以使用页面右上角的“发送反馈”链接发送反馈。
  • 为了大家的娱乐,虽然大家都在思考这个问题并抛出答案,但鬼鬼祟祟的 Firebase 人员修复了文档,所以现在它是正确的。 in and array-contains-any

标签: ios swift firebase google-cloud-firestore


【解决方案1】:

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

对于其他语言也是正确的:

【讨论】:

    【解决方案2】:

    编辑:根据屏幕截图,文档不正确,您是对的。一些澄清,不管:

    这是错误的:

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

    arrayContains 必须输入该数组包含的单数类型(即字符串数组输入字符串),而不是集合。 arrayContains 不执行 OR 或 AND 操作,它只执行数组中元素的单个实例的 equals。

    这是正确的:

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

    这也是正确的:

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

    arrayContainsAny 查询执行 OR 运算,其中 category 必须包含“Animals”或“Dogs”。

    对于度量,还有 in 对非集合(即非数组)字段执行 OR 操作。如果“类别”字段只是 String(而不是 Array),您可以执行 OR 查询:

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

    【讨论】:

    • 我认为您要说明的内容是正确的,但是此 arrayContains 必须输入字符串,而不是数组 不清楚。此外,我们不知道此代码 .whereField("category", arrayContains: ["Animals", "Dogs"]) 对于 OP 的用例来说是错误的。他们是否试图检索字段 category(一个数组)包含 Animals 或 Dogs 的所有节点?如果是这样,那么它是正确的,并且正在对正在搜索的数组执行 OR 查询。
    • arrayContains 必须输入数组包含的元素——字符串数组必须输入一个字符串。要执行OR 操作,他必须使用arrayContainsAny,它必须输入该数组类型的数组——字符串数组必须输入字符串数组。而.whereField("category", arrayContains: ["Animals", "Dogs"]) 总是错误的,无论用例如何,因为它的语法不正确,这就是他返回 0 的原因。他只是语法错误,仅此而已。
    • 好的,谢谢。我附上了文档的屏幕截图。仅 Swift 示例存在错误。
    • 除非它是一个有效的数组数组,但是你是对的,那肯定是一个错字!
    • 感谢您澄清答案,您是绝对正确的。请参阅我对 OP 问题的评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-11
    • 2021-11-01
    • 1970-01-01
    相关资源
    最近更新 更多