【问题标题】:How to query multile field on same collection in firestore如何在firestore中查询同一集合的多个字段
【发布时间】:2020-07-31 11:03:26
【问题描述】:

我是 firebase 和 angular 新手,我想根据选定的过滤器在数据库中搜索事件,我进行了一些搜索并收集了一些代码以使其正常工作,但无法正常工作

collection events{
  eventName: ...,
  eventTicketPrice,
  eventCategory
}

我设置了一些 observable 来监听过滤器按钮的变化,这是我的代码

  items$: Observable<any[]>;
  categoryFilter$: BehaviorSubject<string | null>;
  priceFilter$: BehaviorSubject<string | null>;
  nameFilter$: BehaviorSubject<string | null>;
  dateFilter$: BehaviorSubject<string | null>;
  ageFilter$: BehaviorSubject<string | null>;

  startAt: BehaviorSubject<string | null>;
  endAt: BehaviorSubject<string | null>;
  // startobs = this.startAt.asObservable();
  // endobs = this.endAt.asObservable();

  constructor(
    public eventService: EventsService,
    private db: AngularFirestore
  ) {}

  mobileSize = [425, 375, 320];
  ngOnInit(): void {
    this.mobileSize.forEach((width) => {
      if (window.screen.width === width) {
        // 768px portrait
        this.mobile = true;
      }
    });

    this.categoryFilter$ = new BehaviorSubject(null);
    this.priceFilter$ = new BehaviorSubject(null);
    this.nameFilter$ = new BehaviorSubject(null);
    this.dateFilter$ = new BehaviorSubject(null);
    this.ageFilter$ = new BehaviorSubject(null);
    this.startAt = new BehaviorSubject(null);
    this.endAt = new BehaviorSubject(null);
    
    this.items$ = combineLatest(
      this.categoryFilter$,
      this.priceFilter$,
      this.nameFilter$,
      this.ageFilter$,
      this.startAt.pipe(debounceTime(500), distinctUntilChanged()),
      this.endAt.pipe(debounceTime(500), distinctUntilChanged())
    ).pipe(
      switchMap(([category, price, name, age, start, end]) => 
        this.db.collection('events', ref => {  
        let query : firebase.firestore.Query = ref;
        if (category !== null) { query = query.where('eventCategory', '==', category) };
        if (price == 'high' && price !== null) { query = query.orderBy('eventTicketPrice', 'desc') };
        if (price == 'low' && price !== null) { query = query.orderBy('eventTicketPrice', 'asc') };
        if (name == 'asc' && name !== null) { query = query.orderBy('eventName', 'asc') };
        if (name == 'desc' && name !== null) { query = query.orderBy('eventName', 'desc') };
        if (age !== null) { query = query.where('ageCategory', '==', age) };
        if (start && end !== null) { query = query.orderBy('eventName').startAt(start).endAt(end) };
        return query;
      }).valueChanges({ idField: 'id' }))
    );

目前,我可以按一个类别过滤器进行过滤,但在选择价格过滤器和年龄过滤器等多个过滤器后,我无法过滤数据,

基本上我想通过选择过滤器来搜索数据

【问题讨论】:

  • “选择多个文件管理器后我无法过滤数据” 您似乎有相当广泛的查询构建代码。你给它添加额外的条件有什么问题?
  • 谢谢您,先生,您的回复,我正在尝试从事件集合中获取事件,并且我已将单选按钮(过滤器)和 HTML 中的搜索框与观察者一起放置,我也有在firestore中创建了索引,上面的代码工作正常,过滤器也在工作,但是当我开始在搜索框中搜索一个事件时,只有一个过滤器被应用,即类别,在选择其他过滤器后我没有得到任何结果,比如价格和年龄

标签: javascript angular firebase google-cloud-firestore angularfire2


【解决方案1】:

您当前的代码仅为eventCategory 和ageCategory 添加过滤器。如果您还想为其他条件添加过滤器,则需要在查询中添加更多 where 子句。

例如,如果您想对eventTicketPrice 进行过滤,而不是像现在的代码那样仅对其进行ordering,您需要添加:

...
if (price == 'high') query = query.where('eventTicketPrice', '==', 'high');
...
return query;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-08
    • 2021-08-14
    • 2021-06-10
    • 1970-01-01
    • 2020-07-14
    • 2021-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多