集合文档中具有随机ID的Firestore嵌套文档

拉胡尔·昆杜

我正在使用Angular和firebase创建一个应用程序。我要在该集合内创建一个称为PETS的集合的地方,文档ID当前将登录到用户UID中。在该文档中,我想根据我的表单值创建具有随机ID的文档。

-|pets
   -|userId
        -|RandomId which contains all the form values
        -|RandomId which contains all the form values

现在,我正在使用此方法。请告诉我我需要在此处进行哪些更改。此方法创建与当前用户具有相同ID的集合。但这不是在具有用户ID的父文档中创建单独的文档。我也想用随机ID遍历那些文档,并在前面显示一个PETS列表。

addPet(ownerName, PetName, type, breed, size){
    let user = this.afAuth.auth.currentUser;
    if (user) {
      return new Promise((resolve, reject) => {
        this.afs.collection("pets").doc(user.uid).set({
          OwnerName: ownerName,
          Petname: PetName,
          PetType: type,
          PetBreed: breed,
          PetSize: size
        })
        .then((response) => {
            resolve(response)
        })
        .catch((error) => {
            reject(error)
        });
      })
    } else {
        alert('user not logged in')
    }
  }
samthecodingman

目前,您希望将用户的宠物存放在/pets/userId要在此位置添加每只宠物,您将需要使用一个子集合,因为文档无法容纳其他文档。以下代码添加了将存储在的宠物/pets/userId/pets/somePetId

addPet(ownerName, petName, type, breed, size){
    let user = this.afAuth.auth.currentUser;
    if (!user) {
      return Promise.reject({code: 'unauthenticated', message: 'user not logged in'})
    }
    return this.afs.collection("pets").doc(user.uid).collection("pets").add({
        OwnerName: ownerName,
        OwnerID: user.uid,
        PetName: petName,
        PetType: type,
        PetBreed: breed,
        PetSize: size
      });
  }

但是,您还有另外两种方式可以对数据进行建模。

全球宠物收藏

而不是将宠物保存在之下userId,而是每个宠物都有自己的ID,然后将其链接到其所有者的ID。

addPet(ownerName, petName, type, breed, size){
    let user = this.afAuth.auth.currentUser;
    if (!user) {
      return Promise.reject({code: 'unauthenticated', message: 'user not logged in'})
    }
    return this.afs.collection("pets").add({
        OwnerName: ownerName,
        OwnerID: user.uid,
        PetName: petName,
        PetType: type,
        PetBreed: breed,
        PetSize: size
      });
  }

要为给定用户获取一系列宠物,您可以使用以下方法:

function getPetsForCurrentUser() {
  let user = this.afAuth.auth.currentUser;
  if (!user) {
    return Promise.reject({code: 'unauthenticated', message: 'user not logged in'})
  }
  return this.afs.collection("pets").where("OwnerID", '==', user.uid).get()
    .then(childrenAsArrayOfObjects)
}

用户的宠物子集合

由于您使用的是Cloud Firestore,而不是实时数据库,因此可以将每个宠物另存为所有者的用户数据的子集合。与实时数据库不同,当您获取的数据时/users/userId,您只会获取该特定文档的数据,而不是嵌套在该路径下的所有数据。下面的代码为每个宠物分配自己的ID,并将其保存到其所有者的子集合中:

addPet(ownerName, petName, type, breed, size){
    let user = this.afAuth.auth.currentUser;
    if (!user) {
      return Promise.reject({code: 'unauthenticated', message: 'user not logged in'})
    }
    return this.afs.collection("users").doc(user.uid).collection("pets").add({
        OwnerName: ownerName,
        OwnerID: user.uid,
        PetName: petName,
        PetType: type,
        PetBreed: breed,
        PetSize: size
      });
  }

要为给定用户获取一系列宠物,您可以使用以下方法:

function getPetsForCurrentUser() {
  let user = this.afAuth.auth.currentUser;
  if (!user) {
    return Promise.reject({code: 'unauthenticated', message: 'user not logged in'})
  }
  return this.afs.collection("users").doc(user.uid).collection("pets").get()
    .then(childrenAsArrayOfObjects)
}

使用此数据结构,如果要查询所有宠物,无论它们的所有者如何,都可以使用集合组查询

let ragdollCatsQuery = db.collectionGroup('pets').where('PetType', '==', 'Cat').where('PetBreed', '==', 'Ragdoll');
ragdollCatsQuery.get()
  .then(querySnapshot => {
    console.log("Found " + querySnapshot.size + " cats with the breed: Ragdoll");
  })

其他注意事项

请使用一致的机壳样式,以防止错误和错别字。例如,更改PetnamePetName匹配数据库密钥OwnerName的TitleCase。同样,约定是将camelCase用作变量名,因此变量PetName应为petName

上面的函数都使用以下转换函数:

function childrenAsArrayOfObjects(querySnapshot, idFieldName) {
  let idFieldName = (idFieldName && idFieldName + "") || "id";
  let children = [];
  querySnapshot.forEach(childDoc => {
    children.push({...childDoc.data(), [idFieldName]: childDoc.id})
  }
  return children;
}

如果要在使用此转换时为文档ID使用其他字段名,则可以使用:

.then(querySnapshot => childrenAsArrayOfObjects(querySnapshot, "PetID"))

您可以在此处找到其他转换

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在不同的 Firestore 集合中创建具有相同参考 ID 的文档

来自分类Dev

仅获取具有与单独集合中的文档匹配的ID的FireBase集合中的文档

来自分类Dev

如何检查集合和文档是否存在,如果不存在,则使用 .net 在 FireStore 中创建具有特定 ID 的集合和文档

来自分类Dev

如何从Firestore中的文档ID数组中获取所有子集合文档

来自分类Dev

如何在Cloud Firestore中有效地获取不同集合中具有特定ID的文档?

来自分类Dev

删除Firestore集合中的所有文档

来自分类Dev

如何将具有文档ID的自定义对象设置为扑扑中的Firestore中的集合?

来自分类Dev

从Firestore读取另一个文档中具有ID的文档

来自分类Dev

在 Cloud Firestore 中,如何添加具有显式文档 ID 的文档

来自分类Dev

MongoDB:在具有嵌套文档的文档中设置嵌套文档,其中嵌套数组带有嵌套文档

来自分类Dev

使用随机数更新集合中的所有文档

来自分类Dev

firestore 从集合中的所有文档中获取字段

来自分类Dev

从firstore集合React获取具有ID的文档

来自分类Dev

删除具有给定BSON类型的_id属性的mongo集合中的文档

来自分类Dev

如何在集合中获取文档ID的列表而不在Firestore中获取文档的内容?

来自分类Dev

在 Firestore 的集合中删除所有文档时返回所有文档

来自分类Dev

如何在Firestore中的嵌套文档中更新嵌套文档?

来自分类Dev

如何检索集合中的所有文档并查看Firebase Firestore中是否存在文档?

来自分类Dev

在mongodb集合中具有最大外观的文档

来自分类Dev

如何在Firestore中检查是否存在具有给定ID的文档,而无需花费金钱?

来自分类Dev

如何使用flutter从Firestore中检索具有其ID的文档

来自分类Dev

删除集合的所有嵌套文档

来自分类Dev

即使数据不匹配,在数组中具有嵌套属性的集合文档上的 Mongoose findOne() 也会解析

来自分类Dev

Firebase Firestore 检查文档是否有集合

来自分类Dev

在多个文档ID中的Firestore

来自分类Dev

更新MongoDB集合文档中的嵌套键值

来自分类Dev

未获取具有自定义文档 ID 的 Firestore 文档

来自分类Dev

在子集合Firestore中查询文档

来自分类Dev

在Firestore中访问文档内部的集合

Related 相关文章

  1. 1

    在不同的 Firestore 集合中创建具有相同参考 ID 的文档

  2. 2

    仅获取具有与单独集合中的文档匹配的ID的FireBase集合中的文档

  3. 3

    如何检查集合和文档是否存在,如果不存在,则使用 .net 在 FireStore 中创建具有特定 ID 的集合和文档

  4. 4

    如何从Firestore中的文档ID数组中获取所有子集合文档

  5. 5

    如何在Cloud Firestore中有效地获取不同集合中具有特定ID的文档?

  6. 6

    删除Firestore集合中的所有文档

  7. 7

    如何将具有文档ID的自定义对象设置为扑扑中的Firestore中的集合?

  8. 8

    从Firestore读取另一个文档中具有ID的文档

  9. 9

    在 Cloud Firestore 中,如何添加具有显式文档 ID 的文档

  10. 10

    MongoDB:在具有嵌套文档的文档中设置嵌套文档,其中嵌套数组带有嵌套文档

  11. 11

    使用随机数更新集合中的所有文档

  12. 12

    firestore 从集合中的所有文档中获取字段

  13. 13

    从firstore集合React获取具有ID的文档

  14. 14

    删除具有给定BSON类型的_id属性的mongo集合中的文档

  15. 15

    如何在集合中获取文档ID的列表而不在Firestore中获取文档的内容?

  16. 16

    在 Firestore 的集合中删除所有文档时返回所有文档

  17. 17

    如何在Firestore中的嵌套文档中更新嵌套文档?

  18. 18

    如何检索集合中的所有文档并查看Firebase Firestore中是否存在文档?

  19. 19

    在mongodb集合中具有最大外观的文档

  20. 20

    如何在Firestore中检查是否存在具有给定ID的文档,而无需花费金钱?

  21. 21

    如何使用flutter从Firestore中检索具有其ID的文档

  22. 22

    删除集合的所有嵌套文档

  23. 23

    即使数据不匹配,在数组中具有嵌套属性的集合文档上的 Mongoose findOne() 也会解析

  24. 24

    Firebase Firestore 检查文档是否有集合

  25. 25

    在多个文档ID中的Firestore

  26. 26

    更新MongoDB集合文档中的嵌套键值

  27. 27

    未获取具有自定义文档 ID 的 Firestore 文档

  28. 28

    在子集合Firestore中查询文档

  29. 29

    在Firestore中访问文档内部的集合

热门标签

归档