小编Pas*_*cal的帖子

如何按单个页面对 Firestore 数据集进行分页?

我想按 20 个项目的页面对存储在 Firebase 中的论坛帖子进行分页,如下所示:

  • 用户访问 foo.com/1 --> 加载最近 20 个帖子
  • 用户访问 foo.com/2 --> 加载帖子 21-40

等等。

现在我知道我可以使用查询游标(如此处所述,这对于无限滚动来说效果非常好,因为我从页面 1->2->3 等开始,每次我都有最后一个可见的我的方法中可供参考的文档.startAfter(lastVisible)

但是,如果我希望用户能够访问第 13 页直接查看帖子 241-260,该怎么办?有没有办法从页面文档 241 开始,而不需要先进行(多个)查询来获取 lastVisible 文档?

添加:

这可能非常糟糕,因此在执行以下操作时要小心。我找到了以下方法来“解决”这个问题:

const pageNo = 1 /* variable */
const postsPerPage = 20

const baseRef = fireDb.collection("posts")

let currentPageRef

if (pageNo === 1) {
  currentPageRef = baseRef.limit(postsPerPage)

} else {

  let lastVisibleRef = baseRef.limit((pageNo-1) * postsPerPage)
  const lastVisibleQuerySnapshot = await lastVisibleRef.get()
  const lastVisiblePost = lastVisibleQuerySnapshot.docs[lastVisibleQuerySnapshot.docs.length-1]

  currentPageRef = baseRef.startAfter(lastVisiblePost).limit(postsPerPage) …
Run Code Online (Sandbox Code Playgroud)

javascript firebase google-cloud-firestore

7
推荐指数
1
解决办法
2101
查看次数

如何在Firestore中查询数组中的多个项目?("阵列含有")

我正在使用Firestore和Javascript(vue.js)构建一对一的聊天应用程序.

我有一个对话和一个消息文档定义如下:

.collection( "coversation").DOC()

conversation: {
  participantsArray: ["id1", "id2"],
  participants: {
    id1: {
      /* details like avatar & name */
    },
    id2: {
      /* details like avatar & name */
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

.collection( "coversation").DOC( "foo" 的).收集( "消息").DOC()

message: {
  message: "foo"
}
Run Code Online (Sandbox Code Playgroud)

这很棒,所以我现在可以查询特定用户的所有会话,如下所示:

db.collection('conversations').where("participantsArray", "array-contains", userId)
Run Code Online (Sandbox Code Playgroud)

我现在遇到的问题如下:

我想查询特定的对话,如下所示:

db.collection('conversations')
  .where("participantsArray", "array-contains", userId)
  .where("participantsArray", "array-contains", chatpartnerId)
Run Code Online (Sandbox Code Playgroud)

但这不起作用,因为不允许双"array-contains"并抛出错误消息.

对我来说现在最有效的是打两个电话:

db.collection('conversations')
  .where(`participantsArray`, '==', [userId, chatpartnerId])

db.collection('conversations')
  .where(`participantsArray`, '==', [chatpartnerId, userId])
Run Code Online (Sandbox Code Playgroud)

然后检查这些查询是否返回对话.如果是这样,我会使用该对话添加消息,否则我会创建一个新对话.

它可以工作,但它是一堆代码并且非常低效.

所以我的问题是:

  1. 有一个更好的方法吗?
  2. 怎么做"array-contains"来检查多个项目?
  3. 我有一个participantArray和一个参与者字段,因为我没有弄清楚如何在一个对象数组上做"array-contains".有没有办法或者我应该保留两个领域?

PS: 之前,我曾经查询过参与者对象中的对象,如下所示: …

javascript firebase google-cloud-firestore

5
推荐指数
1
解决办法
1538
查看次数

将 Firebase Firestore 安全规则拆分为单独的文件?

有没有办法将 Firestore 安全规则 (firestore.rules) 拆分为单独的/多个文件?

我想做一个这样的结构:

index.rules // imports all the rules
users.rules
posts.rules
comments.rules
helperFunctions.rules
// ... and so on
Run Code Online (Sandbox Code Playgroud)

我的 firestore.rules 文件变得越来越大,这将使使用它变得更加容易。

firebase firebase-security google-cloud-firestore

5
推荐指数
2
解决办法
928
查看次数