Я хочу объединить два запроса firestore из одной коллекции. Я хочу, чтобы результирующая комбинация была Query.
var a = lessons
.withConverter<Lesson>(
fromFirestore: (snapshot, _) => Lesson.fromFirestore(snapshot),
toFirestore: (Lesson lesson, options) => lesson.toFirestore(),
)
.where('private', isEqualTo: false);
var b = lessons
.withConverter<Lesson>(
fromFirestore: (snapshot, _) => Lesson.fromFirestore(snapshot),
toFirestore: (Lesson lesson, options) => lesson.toFirestore(),
)
.where('private', isEqualTo: true)
.where('author', isEqualTo: uid);
Первый запрос получает все общедоступные уроки независимо от автора, второй запрос получает только частные уроки, созданные пользователем. Затем я хотел бы объединить эти результаты или создать объединение результатов.
Я относительно новичок в флаттер-магазине firestore, я искал некоторые решения в Интернете, но не смог найти ни одного, подходящего для моего конкретного сценария.





var uid = 'your_user_id';
var query = lessons
.withConverter<Lesson>(
fromFirestore: (snapshot, _) => Lesson.fromFirestore(snapshot),
toFirestore: (Lesson lesson, options) => lesson.toFirestore(),
)
.where('private', whereIn: [false, true])
.where('author', isEqualTo: uid);
Вы можете использовать новые возможности ИЛИ Firestore, чтобы поместить это в один запрос. Наиболее дословный перевод будет выглядеть так:
lessons.where(
Filter.or(
Filter("public", isEqualTo: true),
Filter.and(
Filter("author", isEqualTo: user.uid),
Filter("public", isEqualTo: false)
)
)
)
Поскольку ваш public является логическим значением, это может быть только true или false, вы можете переписать приведенное выше в этой более короткой форме:
lessons.where(
Filter.or(
Filter("author", isEqualTo: user.uid),
Filter("public", isEqualTo: true)
)
)
Результаты для обоих гарантированно будут одинаковыми, поэтому я бы выбрал последний, более короткий запрос.
Я попробовал ваше решение, но я получаю сообщение об ошибке. Я получаю Undefined name 'Filter'. Я перешел к ссылке, которую вы предоставили, и там нет доступного фрагмента для Dart.
Я протестировал этот код здесь: zapp.run/edit/…. Возможности OR являются новыми, поэтому вам, вероятно, потребуется перейти на более новую версию SDK.
Я использовал старые пакеты Firebase, но теперь все работает нормально. Спасибо!!
Первый запрос получает все общедоступные уроки независимо от автора, второй запрос получает только частные уроки, созданные пользователем. Затем я хотел бы объединить эти результаты или создать союз. С вашим подходом я бы получал только публичные и частные уроки, которые создает пользователь.