firebase 如何创建以uid作为集合名称Firestore的子集合

f87krz0w  于 2023-02-25  发布在  其他
关注(0)|答案(1)|浏览(145)

我在数据库的根目录下有一个集合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 idanything here部分是不必要的,因为我可以使用categoryNamefirebase generated id,这样可以避免另一层嵌套。
有没有办法做到这一点?

nwwlzxa7

nwwlzxa71#

您尝试做的事情是不可能的-您不能让两个文档直接“位于”集合中的单个文档ID(在您的情况下是uid)之下。集合中的每个唯一文档ID只能存在一个文档。您也不能让子集合直接嵌套在集合之下。集合只能包含文档,而子集合只能嵌套在文档之下。
你展示的第二个东西实际上是一个包含一个真正的子集合的结构(它必须有一个名称--你已经将它命名为“anything here”),这实际上是一个将多个文档与一个用户相关联的好方法。我不清楚你为什么不想要这个结构,但如果你想在一个ID为uid的文档下嵌套文档,这确实是唯一的方法。
唯一可行的替代方法是根本不使用uid作为文档ID,而是:
1.使uid成为文档的字段。
1.接受随机ID Firestore将分配给它当你添加它。
1.在该字段中使用用户的uid向集合中添加任意数量的文档。
然后,您可以筛选该uid字段,以查找与该用户关联的所有文档。

相关问题