【问题标题】:How to get the count of data under a document under a collection?如何获取集合下文档下的数据计数?
【发布时间】:2019-07-09 13:00:55
【问题描述】:

我有一个名为“用户关注者”的集合。我基本上需要显示关注者的总数。只是无法弄清楚完成块以获得计数。有一些资源可以帮助我计算集合下的文档数量,但是文档中的值呢?这是数据在 Firestore 中的存储方式:

Collection: "user-followers"
 Document: "abc"
  "user1":1
  "user2":1
  "user3":1

我要统计“abc”文档下的用户数,即3。

有获取所有文档计数的资源,但是文档中的数据计数呢?

【问题讨论】:

  • 您是否将 user1: 1、user2: 2 等存储为文档中的字段?如果是这样,那将不是存储数据的好方法。

标签: ios swift firebase google-cloud-firestore


【解决方案1】:

我不确定这样存储您的数据是不是最好的主意,但您似乎在询问如何获取文档中的字段计数。

一个简单的解决方案是计算子数据,在这种情况下是三个。

func countFields() {
    let collectionRef = self.db.collection("user-followers")
    let documentRef = collectionRef.document("doc")
    documentRef.getDocument(completion: { documentSnapshot, error in
        if let error = error {
            print(error.localizedDescription)
            return
        }

        let q = documentSnapshot?.data()?.count
        print(q)
    })
}

documentSnapshot?.data() 是一个可以迭代、计数等的字典。

【讨论】:

    【解决方案2】:

    默认情况下不支持此功能,但您有多种方法可以解决此问题。 (除非您可以查询整个集合以获取记录数......这意味着一切,字面上的一切)

    • 云函数
     import * as functions from 'firebase-functions' 
     import * as admin from 'firebase-admin' 
     const firestore = admin.firestore()
     const counterRef =  firestore.collection(`counters`)
     export const keepCount = functions
      .firestore.document(`user-followers/{doc}`).onWrite(async (change, _context) => {
        const oldData = change.before
        const newData = change.after
        const data = newData.data()
    
        if (!oldData.exists && newData.exists) {
            // creating
            return counterRef.doc(`user-followers`).set({
              counter: firebase.firestore.FieldValue.increment(1)
            })
          } else if (!newData.exists && oldData.exists) {
            // deleting
            return return counterRef.doc(`user-followers`).set({
              counter: firebase.firestore.FieldValue.increment(-1)
            })ID)
          } else  {
            // updating - do nothing
            return Promise.resolve(true)
        }
    })
    

    现在您只需要获取counters 集合,文档值是您的集合名称user-followers,道具是计数器...您可以将此模式应用于跟踪计数器所需的所有集合...

    • 其他第三方缓存工具

    您始终可以使用 algolia 或 redis 等其他工具来跟踪这一点,但它们会花费更多的钱。

    我会应用云功能开始。

    【讨论】:

    • 该功能已构建并完全支持。您只需要使用 documentSnapshot.data()(字典)而不是 documentSnapshot 本身。
    • 这是部分正确的,您需要查询整个集合才能得到总数,这在大多数情况下都是过度杀伤
    • 啊 - 我想这就是你错过的。它不是一个集合 - 它是 OP 所询问的集合 的单个文档。他想知道该文档中有多少字段。
    • 是的,这并不能直接回答问题,但我又学到了一些新的东西,这是我以前不知道的。谢谢@andresmijares
    猜你喜欢
    • 2018-07-10
    • 2020-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 2018-05-25
    • 2014-10-17
    • 1970-01-01
    相关资源
    最近更新 更多