我在数据库的根目录下有一个集合userCategories。
在我的应用中,用户可以添加"类别",类别的名称将是唯一的,每个类别文档看起来像这样:
{
createdAt:Timestamp.now(),
categoryName: userDefinedCategoryName,
color:randomColorCode
}
我希望它的结构如下:
root-
|-userCollection
|-uid1
|-uid2
|-userCategories
|-uid1
|-{createdAt:...,categoryName:"...",color:"..."}
-{createdAt:...,categoryName:"...",color:"..."}
|-uid2
|-{createdAt:...,categoryName:"...",color:"..."}
我目前正在使用:
const categoryDocRef = doc(db, "userCategories", uid);
await setDoc(
categoryDocRef, {
createdAt:Timestamp.now(),
categoryName:category,
color:color
}).then(() => {
return {
success: true,
errorMessage:""
};
});
但这只允许我在每个uid中创建单个文档,而不是像uid1那样创建多个文档。
我知道我可以做这样的事情:
const categoryDocRef = doc(db, "userCategories",uid);
const colRef = collection(categoryDocRef, "Anything Here")
await addDoc(
colRef, {
createdAt:Timestamp.now(),
categoryName:category
color:color
}).then(() => {
console.log(`User document for uid:${uid}`);
return {
success: true,
errorMessage:""
};
});
但这样就产生了这样一个结构:
|-userCategories
|-uid1
|-anything here
|-firebase generated id
|-{createdAt:...,categoryName:"...",color:"..."}
-{createdAt:...,categoryName:"...",color:"..."}
我觉得firebase generated id
或anything here
部分是不必要的,因为我可以使用categoryName
或firebase generated id
,这样可以避免另一层嵌套。
有没有办法做到这一点?
1条答案
按热度按时间nwwlzxa71#
您尝试做的事情是不可能的-您不能让两个文档直接“位于”集合中的单个文档ID(在您的情况下是uid)之下。集合中的每个唯一文档ID只能存在一个文档。您也不能让子集合直接嵌套在集合之下。集合只能包含文档,而子集合只能嵌套在文档之下。
你展示的第二个东西实际上是一个包含一个真正的子集合的结构(它必须有一个名称--你已经将它命名为“anything here”),这实际上是一个将多个文档与一个用户相关联的好方法。我不清楚你为什么不想要这个结构,但如果你想在一个ID为uid的文档下嵌套文档,这确实是唯一的方法。
唯一可行的替代方法是根本不使用uid作为文档ID,而是:
1.使uid成为文档的字段。
1.接受随机ID Firestore将分配给它当你添加它。
1.在该字段中使用用户的uid向集合中添加任意数量的文档。
然后,您可以筛选该uid字段,以查找与该用户关联的所有文档。