gpt4 book ai didi

javascript - 在集合文档中使用随机 ID 的 Firestore 嵌套文档

转载 作者:行者123 更新时间:2023-12-04 10:49:31 25 4
gpt4 key购买 nike

我正在使用 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')
}
}

最佳答案

当前您希望将用户的宠物存储在 /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)
}

有了这个数据结构,如果你想查询所有的宠物,不管它们的主人是谁,你可以使用 collection group query .

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匹配数据库 key OwnerName的 TitleCase。同样,约定是使用驼峰命名的变量名,所以变量 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"))

您可以找到其他转换 here .

关于javascript - 在集合文档中使用随机 ID 的 Firestore 嵌套文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59546879/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com