Как отфильтровать список идентификаторов на firebase cloud firestore? - PullRequest
1 голос
/ 16 октября 2019

У меня есть две коллекции. (applyJobs и Jobs и users). Когда пользователи подают заявку на работу, я сохраняю эту запись в коллекции applyJobs. Вот так:

applyId:****, 
jobId:*****,
userId:*****

Теперь я хочу показать все заявки на вакансии пользователя. Первый: получить идентификатор зарегистрированного пользователя, я храню локально зарегистрированный идентификатор пользователя. Таким образом, я могу получить зарегистрированный идентификатор пользователя.

Второе: я фильтрую Apply Jobs по этому идентификатору. вот так var ref = _db.collection('applyJobs').where('userId',isEqualTo: uid);. Я здесь я не назвал users коллекцию, чтобы получить UID. потому что я уже храню UID локально. Это лучшая практика?

Третье: я сохраняю результат здесь List<ApplyJobsModelClass>. Я хочу получить все вакансии по списку идентификаторов. Как мне это отфильтровать?

Вот так я и попробовал. Но это не список идентификаторов. только один идентификатор.

streamApplyJob(List<String> jobId) {
   Collection('jobs').document(jobId);
}

И я тоже так пробовал.

  Stream<List<JobModel>> streamApplyJob(List<String> jobId) {
     var ref = _db.collection('jobs').where('jobId',isEqualTo: jobId);
    return ref.snapshots().map((list) =>
        list.documents.map((doc) => JobModel.fromFirestore(doc)).toList());
  }

пытался получить длину, но результат 0

db.streamApplyJob(jobIds).listen((v)=>{
  print(v.length)
});

Полный код

Сторона базы данных

  ///Get a stream of apply jobs
  Stream<List<ApplyJobModel>> streamApplyJobs(String uid) {
    var ref = _db.collection('applyJobs').where('userId',isEqualTo: uid);

    return ref.snapshots().map((list) =>
        list.documents.map((doc) => ApplyJobModel.fromFirestore(doc)).toList());
  }

  ///Get a stream of a single document
  Stream<List<JobModel>> streamApplyJob(List<String> jobId) {
     var ref = _db.collection('jobs').where('jobId',isEqualTo: jobId);
    return ref.snapshots().map((list) =>
        list.documents.map((doc) => JobModel.fromFirestore(doc)).toList());
  }

вызов

  List<String> jobIds = [];

  void getData() {
    db.streamApplyJobs(widget.uid).listen((listApplies) => {
          for (int i = 0; i < listApplies.length; i++)
            {jobIds.add(listApplies[i].jobId)},
        });
    db.streamApplyJob(jobIds).listen((v)=>{
      print(v.length)
    });
  }

Решение (это работает сейчас) - это лучшая практика илиЕсть ли другой лучший способ сделать это?

  Future<List<JobModel>> getJobs() async {
    await db.streamJobs(true).listen((jobs) {
      setState(() {
        jobModel = jobs;
      });
    });
    return jobModel;
  }

  Future getData() async {
    await getJobs();
    db.streamApplyJobs(widget.uid).listen((apply) => {
          for (int j = 0; j < jobModel.length; j++)
            {
              for (int i = 0; i < apply.length; i++)
                {
                  if (apply[i].jobId == jobModel[j].jobId)
                    {
                      jobModelNew.add(jobModel[j]),
                    }
                }
            }
        });
  }

Ответы [ 2 ]

1 голос
/ 16 октября 2019

Я хочу получить все вакансии по списку идентификаторов. Как мне его отфильтровать?

В настоящее время нет способа передать список идентификаторов в запрос Firestore и получить документы, соответствующие всем этим идентификаторам. См. Google Firestore - как получить документ по нескольким идентификаторам за одну поездку? (что говорит об этом с помощью идентификаторов документов) и Firebase Firestore - ИЛИ запрос (который говорит о фильтрациидля нескольких значений в одном поле).

Если ваш вариант использования не соответствует обходному пути, упомянутому во втором ответе, вам придется выполнить отдельный запрос для каждого значения и объединить результаты в коде приложения.

1 голос
/ 16 октября 2019

Пожалуйста, посмотрите на этот пример . Он связывает CollectionReference со списком.

Дайте мне знать, если это полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...