Firebase Cloud Firestore Запрос, где EqualTo для справки - PullRequest
0 голосов
/ 27 июня 2018

Я пытаюсь создать запрос, который выбирает только те документы, ссылка на которые равна заданной ссылке, используя Java для разработки под Android. Документ, которому он соответствует, содержит ссылку на путь "/ users / someUser". Я создаю ссылку так:

DocumentReference ref = mDatabase.document("users/someUser");

Я также пробовал:

DocumentReference ref = mDatabase.document("/users/someUser");

Тогда запрос:

Query query = mDatabase.collection("myCollection").whereEqualTo("refField", ref).limit(10); 

Однако, когда я запускаю запрос и проверяю task.isSuccessful() в методе onComplete, он не проходит, т.е. не работает, тогда как когда я удаляю .whereEqualTo(), он проходит, а результат задачи не пустой. Как правильно использовать .whereEqualTo() для проверки всех документов, содержащих конкретные ссылки?

Примером документа, который должен соответствовать моему запросу, будет:

/myCollection/GDpojS5koac2C7YlIqxS, который содержит поле:
refField: /users/someUser (значение типа ссылки)

И пример документа, который не должен соответствовать моему запросу:

/myCollection/J5ZcVAMYU1nI5XZmh6Bv, который содержит поле:
refField: /users/wrongUser (значение типа ссылки)

Ответы [ 2 ]

0 голосов
/ 10 июля 2018

Вам не нужно беспокоиться о документах, если вы создадите запрос на основе ваших полей, тогда все документы будут возвращены в объекте "QuerySnapshot", например,

CollectionReference collectionReference = db.collection(FIRESTORE_USERS);
                DocumentReference documentReference = collectionReference.document(userID);
                CollectionReference notificationCollection = documentReference.collection(FIRESTORE_NOTIFICATIONS);

    notificationCollection.whereEqualTo(USER_TYPE, userType)
                        .whereGreaterThanOrEqualTo(SEND_AT, calendar.getTime())
                        .get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
                    @Override
                    public void onSuccess(QuerySnapshot documentSnapshots) {
                        List<DocumentSnapshot> snapshotsList = documentSnapshots.getDocuments();
                        ArrayList<NotificationCollections> notificationCollectionsArrayList = new ArrayList<>();
                        for (DocumentSnapshot snapshot : snapshotsList) {
                       // each document having that particular field based on query
    }
    }});

в приведенном выше примере я извлекаю все те документы, которые соответствуют определенному идентификатору пользователя, а также имеют время, большее или равное предоставленному времени (время не будет использоваться в вашем случае)

Надеюсь, это поможет ...

Удачного кодирования:)

0 голосов
/ 10 июля 2018

Я думаю, вам нужно добавить метод get () для выполнения запроса и добавить onCompletionListener.

Примерно так должно работать:

mDatabase.collection("myCollection")
  .whereEqualTo("refField", ref)
  .limit(10)
  .get()
  .addOnCompleteListener({task ->
                         if(task.isSuccessful){
                            val result = task.result                 
                        })

Приведенный выше пример в kotlin, но я думаю, что в java это что-то похожее

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