直接在Google Firestore中获取DocumentId

时间:2018-08-16 23:35:37

标签: javascript firebase google-cloud-firestore

从Firestore查询后,我经常需要在本地对象中使用documentId。由于documentId为no字段,因此我在查询中执行以下操作以实现此目的:

const ref = fireDb.collection('users')
const query = await ref.where("name", "==", "foo").get()

let users = []

query.forEach((doc) => {
  let user = doc.data()
  user.id = doc.id             /* <-- Here I add the id to the local object*/
  users.push(user)
})

是否有一种“简便”的方法可以直接取回包含其ID的文档?还是应该怎么做?

我不想将documentId复制到一个字段中,即使对于NoSql数据库,这似乎也是多余的。

但是由于这是我几乎所有的询问之后我需要做的事情,我想知道Firestore是否无法选择传送包含其ID的文档?

...我想这就是他们所说的第一世界问题? :)

1 个答案:

答案 0 :(得分:1)

似乎目前没有选择将documentId直接嵌入到对象中。

为了减少样板代码并保持代码干净,我编写了以下帮助程序函数,将documentId添加到每个对象。

对于收藏集和单个文档,它都是这样做的。

帮助功能

const queryFirestore = async function (ref) {

  let snapshot = await ref.get()

  switch(ref.constructor.name) {

    /* If reference refers to a collection */
    case "CollectionReference":
    case "Query$$1":
      let items = []
      snapshot.forEach((doc) => {
        let item = doc.data()
        item.id = doc.id
        items.push(item)
      })
      return items

    /* If reference refers to a single document */
    case "DocumentReference":
      let documentSnapshot = await ref.get()
      let item = documentSnapshot.data()
      item.id = documentSnapshot.id
      return item
  }
}

现在输入我的代码...

对于收藏集:

async getUsers() {
  let ref = db.collection("users")
  return await queryFirestore(ref)
}

对于单个文档:

async getUser(userId) {
  let ref = db.collection("users").doc(userId)
  return await queryFirestore(ref)
}