如何获取集合下文档下的数据计数?

时间:2019-07-09 13:00:55

标签: ios swift xcode firebase

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

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

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

有一些资源可以获取所有文档的数量,但是文档内部的数据数量又如何呢?

2 个答案:

答案 0 :(得分: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()是一个字典,可以对其进行迭代,计数等。

答案 1 :(得分:0)

默认情况下不支持此功能,但是有几种解决方法。 (除非您可以查询整个集合以获取记录数...这意味着所有内容,实际上是所有内容)

  • 云功能
 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集合,doc值就是您的集合名称user-followers,而prop是计数器...您可以将此模式应用于需要保留的所有集合柜台的轨迹...

  • 其他第三方缓存工具

您始终可以使用其他工具(例如algolia或redis)来跟踪此情况,但是它们的成本更高。

我将应用云功能开始学习。