【问题标题】:Build Firebase queries dynamically动态构建 Firebase 查询
【发布时间】:2021-11-06 08:41:51
【问题描述】:

我想知道是否可以动态构建 firebase 查询,目前我正在使用一个变量来确定是否应该包含 startAfter

如您所见,这会导致重复代码,仅针对一个变量

export async function fetchUserPhotosPaginated(userId: string, lastUserPhoto?: QueryDocumentSnapshot): Promise<QuerySnapshot> {
    if (lastUserPhoto) {
        return await getDocs(query(
            collection(db, 'photos'),
            orderBy('createdAt', 'desc'),
            startAfter(lastUserPhoto),
            where('user.id', '==', userId),
            limit(5)
        ))
    }

    return await getDocs(query(
        collection(db, 'photos'),
        orderBy('createdAt', 'desc'),
        where('user.id', '==', userId),
        limit(5)
    ))
}

我试过了

  • 使用startAfter(null),这并没有达到预期的效果
  • 将查询分配给变量 let q = query(...),然后使用 q = q.startAfter(...) 更新该查询,这也不起作用

【问题讨论】:

    标签: javascript firebase google-cloud-firestore


    【解决方案1】:

    有条件地添加startAfter 的第二种方法是正确的,但您更新查询的语法不正确。尝试重构函数,如下所示:

    export async function fetchUserPhotosPaginated(userId: string, lastUserPhoto?: QueryDocumentSnapshot): Promise<QuerySnapshot> {
      // Initial query
      let q = query(collection(db, 'posts'), orderBy('createdAt', 'desc'))
      
      // Add startAfter is lastUserPhoto is present    
      if (lastUserPhoto) q = query(q, startAfter(lastUserPhoto));
      
      // Add remaining conditions
      q = query(q, where('user.id', '==', userId), limit(5)); 
    
      return await getDocs(q)
    }
    

    您还可以按照以下答案中的说明在数组中添加所有条件:

    Firestore conditional where clause using Modular SDK v9

    【讨论】:

      猜你喜欢
      • 2012-11-23
      • 2019-04-08
      • 2012-12-21
      • 2018-12-21
      • 1970-01-01
      • 1970-01-01
      • 2013-08-12
      • 2019-06-24
      • 2020-12-03
      相关资源
      最近更新 更多