Firestore "массив-содержит-любой" не работает - PullRequest
2 голосов
/ 11 декабря 2019

Я пытаюсь использовать запрос для Firestore на iOS (Swift):

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"])

Так в чем же заключается идея этой функции, что я должен сделать, чтобы получить ИЛИ?

Ответы [ 2 ]

3 голосов
/ 11 декабря 2019

Проблема в примере кода в документации. Это должно быть arrayContainsAny enter image description here

Это верно для других языков:

enter image description here

2 голосов
/ 11 декабря 2019

РЕДАКТИРОВАТЬ: Судя по скриншоту, документация неверна, вы правы. Некоторые пояснения, независимо от того:

Это неправильно:

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

arrayContains должен вводить тип единственного числа того, что содержит этот массив (то есть строковый массив вводит строку), а не коллекцию,arrayContains не выполняет операции ИЛИ или И, он выполняет только эквивалент одного экземпляра элемента в массиве.

Это правильно:

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

Это также правильно:

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

Запрос arrayContainsAny выполняет операцию ИЛИ, где category должен содержать «Животные» или «Собаки».

А для меры также существует in, который выполняетоперация ИЛИ в поле, не являющемся коллекцией (т.е. не в массиве). Если бы поле «категория» было просто String (а не Array), вы могли бы выполнить запрос ИЛИ с помощью:

.whereField("category", in: ["Animals", "Dogs"])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...