поиск значения вложенного документа в пожарном депо - PullRequest
0 голосов
/ 20 сентября 2019

Я использую базу данных firestore, которая имеет следующую структуру:

У меня есть коллекция с именем NBDB, внутри есть документы с uid каждого пользователя.Например, у меня есть 2 пользователя, поэтому у меня есть 2 документа, которые называются: ZxK2BR..., xy9BHY....

. В каждом документе пользователя есть еще одна коллекция, которая называется MyBooks, и есть документы для всех книг, которые ищет пользователь..

Вот фотографии из моей базы данных: enter image description here

enter image description here Я хочу сделать экран домашней страницы похожим на 20случайные изображения из всех изображений, которые пользователи имеют в базе данных приложения.

Насколько я понимаю, мне нужно проникнуть внутрь каждого пользовательского документа и найти все my books, которые у него есть, а затем перейти к следующему пользователю..

Наконец, моя цель - прочитать значение BookID всех пользователей и выбрать 20 случайных

. Я использовал следующее для получения всех BookID из определенных пользователь:

FirebaseFirestore db = FirebaseFirestore.getInstance();
CollectionReference MyDB = db.collection( "NBDB" ).document(auth.getUid()).collection( "MyBooks" );

MyDB.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
    @Override
    public void onComplete(@NonNull Task<QuerySnapshot> task) {
        if (task.isSuccessful()) {
            List<String> list = new ArrayList<>();
            for (QueryDocumentSnapshot document : task.getResult()) {
                list.add(document.getString( "BookID" ));
            }
            Log.d(TAG, list.toString());
        } else {
            Log.d(TAG, "Error getting documents: ", task.getException());
        }
    }
});

Спасибо

1 Ответ

0 голосов
/ 21 сентября 2019

Я думаю, что вы хотите получить случайным образом 20 разных изображений из любой коллекции пользователя.Тем не менее, если вы не решите использовать другую структуру и хотите, чтобы все данные были вложенными, вы можете выбрать запрос collectionGroup.

Бит "random" немного сложен, и выВозможно, вы захотите использовать некоторые хакерские способы заставить его работать.Но начиная с получения доступа к вложенным вложенным коллекциям различных пользователей:

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

То, как я это сделал бы со случайным битом случайного изображения, было бы в частичном коде псевдокода, чтобы дать вам идею (я подтвердил collectionGroups в SDK Java):

usedImages = []
for numbers 0 to 19 {
   let num = false
   while (!num) {
     let tempNum = Math.floor(Math.random() * 10);
     if (!( usedImages.includes(tempNum)){
        num = tempNum
     }
   }

   var allBooks = db.collectionGroup('MyBooks').where('imageKey', '==', num);
     allBooks.get().then(function (querySnapshot) {
        querySnapshot.forEach(function (doc) {
        console.log(doc.id, ' => ', doc.data());
     });
   });

}

Идея с кодом состоит в том, чтобы сгенерировать 20 случайных и уникальных чисел num (возможно, лучшие способы сделать это, чем то, что я взломал вместе выше), а затем взять это число и найти все записи в MyBooks, где существует этот imageKey.Это хакерский способ обхода кода случайного изображения, когда вам нужно будет добавить глобально уникальный идентификатор для каждого из них.

Коллекция группы не указывает путь родительских коллекций, поэтому она позволяет вам искатьсразу во все коллекции.

В приведенном выше псевдокоде выполняется 20 запросов групп коллекций.

Подробнее о запросах групп коллекций можно найти здесь: https://firebase.google.com/docs/firestore/query-data/queries#collection-group-query

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