查询文档后,我想知道是否可以引用子集合?我知道.get()返回一个promise,我们在上面写一个函数来获取文档。但是是否可以使用查询的文档来访问该子集合,而不必获取文档的ID并在.doc()中使用它?
答案 0 :(得分:1)
否,这不可能不发出新查询。没有方法允许DocumentSnapshot
使用该方法。
为了说明这一点,让我们假设您通过查询获得了一个城市文件(您知道该文件仅返回一个文档):
var citiesRef = db.collection("cities");
citiesRef.where("name", "==", "Brussels").get()
.then(function(querySnapshot) {
if (!querySnapshot.empty) {
var doc = querySnapshot.docs[0];
console.log("Document data:", doc.data());
} else {
// doc.data() will be undefined in this case
console.log("No such document!");
}
}).catch(function(error) {
console.log("Error getting document:", error);
});
,您知道此文档为该城市的餐厅提供了一个子集合。如果要获取此收藏集,则需要执行以下操作:
var citiesRef = db.collection("cities");
citiesRef.where("name", "==", "Brussels").get()
.then(function(querySnapshot) {
if (!querySnapshot.empty) {
var doc = querySnapshot.docs[0];
var restaurantsCollRef = citiesRef.doc(doc.id).collection("restaurants");
return restaurantsCollRef.get();
} else {
throw new Error("No such document!");
}
})
.then(function(querySnapshot) {
querySnapshot.forEach(function(doc) {
console.log(doc.id, " => ", doc.data());
})
}).catch(function(error) {
console.log("Error getting document:", error);
});
需要注意的一点是,实际上,从技术的角度来看,文档及其子集合不是相互关联的。
让我们举个例子:想象一个doc1
集合下的col1
文档
col1/doc1/
和subDoc1
(子)集合下的另一个subCol1
col1/doc1/subCol1/subDoc1
实际上,他们只是分享自己的道路的一部分而已。这样做的副作用是,如果删除文档,则其子集合仍然存在。