Получение списка идентификаторов пользователей из вложенной коллекции в базе данных Firestore с использованием TypeScript (NestJs)

Я работаю над Firestore и структурой моей коллекции Firestore, как показано ниже:

Пользователи-> userId1 -> UserDetails -> User_Info -> Данные JSON

Пользователи-> userId2 -> UserDetails -> User_Info -> Данные JSON

Пользователи-> userId3 -> UserDetails -> User_Info -> Данные JSON.

Пользователи-> userId4 -> UserDetails -> User_Info -> Данные JSON.

Для лучшего понимания, пожалуйста, посмотрите на снимок ниже:

Теперь мне нужен запрос Firestore, чтобы получить список идентификаторов пользователей, у которых естьisCardOrderedявляетсяtrue.

Результат должен быть:

      [
"userId1",
"userId2",
"userId3",
"userId4"
]

Я делаю это, но не получаю правильного результата.

      @Injectable()
export class UsersClient {
    constructor(
        @Inject(UsersClientDocument.collectionName)
        private UsersCollection: CollectionReference<UsersClientDocument>,
    ) { }
   
   
   
        async fetchByQuery(query) {
            console.log('******************************');
            const querySnapshot = await this.UsersCollection.where('cardInfo[0].isCardOrdered', '==', true).get();
            querySnapshot.forEach((doc) => {
                console.log(' **********fetchByQuery:',doc.id, ' => ', doc.data());
        });
    }
    
    
}

И я вызываю этот метод следующим образом:

          const fireBaseUser: any = await this.UsersClient.fetchByQuery();
    console.log('fireBaseUser:',fireBaseUser);

Запрос: Любая помощь будет оценена по достоинству. Спасибо

1 ответ

Похоже, твойcardInfoпредставляет собой массив, и Firestore не поддерживает запрос элемента в массиве так, как вы пытаетесь здесь:

      this.UsersCollection.where('cardInfo[0].isCardOrdered', '==', true).

Если вы хотите разрешить этот запрос, вам придется (также) сохранить это значение в поле, которое Firestore может запрашивать. Например, если вы добавите дополнительное поле верхнего уровняisCardZeroOrdered, вы можете запросить это:

      this.UsersCollection.where('isCardZeroOrdered', '==', true).

Вы также можете хранить информацию в поле карты , а не в массиве, что визуально будет очень похоже, но позволит вам выполнять запросы с помощью:

      this.UsersCollection.where('cardInfo.zero.isCardOrdered', '==', true).
Другие вопросы по тегам