Firestore: как выполнить запрос с неравенством/не равен

Я хочу выбрать из коллекции Firestore только статьи, написанные НЕ мной.
Это действительно так сложно?

В каждой статье есть поле "owner_uid".

Thats it:
Я просто хочу написать эквивалент "select * from articles where uid<>request.auth.uid"

Ответ 1

Firestore не обеспечивает проверку неравенства. Согласно документации:

Метод where() принимает три параметра: поле для фильтрации, операцию сравнения и значение. Сравнение может быть <, < =, ==, > , или > =.

Операции неравенства не масштабируются, как другие операции, которые используют index. Индексы Firestore подходят для запросов диапазона. С этим типом индекса для запроса неравенства бэкэнд все равно должен будет сканировать каждый документ в коллекции, чтобы придумать результаты, и это очень плохо для производительности, когда число документов растет.

Если вам нужно отфильтровать результаты для удаления определенных элементов, вы все равно можете сделать это локально.

У вас также есть возможность использовать несколько запросов для исключения отдельного значения. Что-то вроде этого, если вы хотите все, кроме 12. Запрос для значения < 12, затем запросите значение > 12, а затем объедините результаты в клиенте.

Ответ 2

Из документации по пожарной базе

Запросы с предложением! =. В этом случае вы должны разделить запрос в запрос больше, чем запрос меньше. Например, хотя Предложение запроса, где ("age", "! =", "30") не поддерживается, вы можете получить один и тот же набор результатов, объединив два запроса, один с предложением где ("age", "& lt;", "30") и один с предложением where ("age", ">", 30).

Ответ 3

Для Android это должно быть легко реализовано с помощью Task Api. Пример новичка:

    FirebaseFirestore db = FirebaseFirestore.getInstance();
    Query lessQuery = db.collection("users").whereLessThan("uid", currentUid);
    Query greaterQuery = db.collection("users").whereGreaterThan("uid", currentUid);
    Task lessQuery Task = firstQuery.get();
    Task greaterQuery = secondQuery.get();

    Task combinedTask = Tasks.whenAllSuccess(lessQuery , greaterQuery)
                             .addOnSuccessListener(new OnSuccessListener<List<Object>>() {
        @Override
        public void onSuccess(List<Object> list) {

            //This is the list of "users" collection without user with currentUid
        }
    });

Кроме того, с этим вы можете объединить любой набор запросов.

Для веба есть rxfire

Ответ 4

let query = docRef.where('role','>',user_role).where('role','<',user_role).get()

Это не функционирует как операция "не равно" в firestore со строковыми значениями