我正在使用 cloud firestore 数据库在 next.js 应用程序中为用户存盘档案,收集路径如下集合“userDocs”-> 档案“userEmail”-> 集合“docs”-> 档案“documentObject”。
我使用的是 firebase v9 sdk 并降级到 firebase v8,但我仍然面临同样的问题。
此代码片段是我向数据库添加新档案的地方,该档案已完成并在 firebase 控制台中成功反映
db.collection("userDocs").doc(session.user.email).collection("docs").add({ fileName: input, timestamp: firebase.firestore.FieldValue.serverTimestamp(),
});
尝试从数据库中获取档案时,我尝试了以下方法
1- 使用 react-firebase-hooks
const [snapshot] = useCollectionOnce(
db
.collection("userDocs")
.doc(session?.user.email)
.collection("docs")
.orderBy("timestamp", "desc")
);
2-使用firebase查询
useEffect(() => { var query = db.collection("userDocs");
query.get().then((querySnapshot) => {
querySnapshot.forEach((document) => { document.ref
.collection("docs")
.get()
.then((querySnapshot) => { console.log(querySnapshot);
});
});
});
这就是我尝试使用 firebase v9 实作它的方式
import {
collection,
query,
orderBy,
serverTimestamp,
setDoc,
doc,
collectionGroup,
onSnapshot,
getDocs,} from "firebase/firestore";useEffect(async () => { const docRef = query( collection(db, "UserDocs", session?.user.email, "Docs"), orderBy("timestamp", "desc")
);
const docSnap = await getDocs(docRef);
const allDocs = docSnap.forEach((doc) => { console.log(`Document ${doc.id} contains ${JSON.stringify(doc.data())}`);
});
}, []);
uj5u.com热心网友回复:
我设法使用以下方法解决了这个问题:
1- 我重组了我的数据库以包含“docs”集合,该集合包含在具有以下属性 {email、fileName、timestamp} 的档案物件中,而不是创建子集合。
我创建了以下方法来获取资料并将其映射到状态阵列中以便能够呈现它
const getDocuments = async () => { await db
.collection("docs")
.where("email", "==", session?.user.email)
.orderBy("timestamp", "desc")
.get()
.then((res) => { setUserDocs(res.docs);
})
.catch((error) => { console.log(error);
});
};
我仍然不太确定为什么这次尝试比所有其他试验都有效,但到目前为止我设法使事情有效,所以这是目前最重要的事情。
uj5u.com热心网友回复:
问题是您没有正确构建资料。如Firebase官方档案中所示选择一种资料结构,
因此,根据您在答案中共享的代码,您使用的结构是档案中的嵌套资料。
我对你的第一种方法有点迷茫,但既然你终于让它作业了,建议是根据档案中的说明和适合你的需要来构建你的资料。
也可以看看
https://firebase.google.com/docs/firestore
0 评论