我正在一个节点项目中工作,我安装了firebase包。这是我的数据库结构。
我想在一次操作中提取客户端www.example.com的所有数据aaa@gmail.com。我的意思是姓名、电子邮件、年龄和所有地址。
const docClient = doc(db,"Client", "aaa@gmail.com");
const collectionAddresses = collection(docClient, "addresses");
const DataClient = await getDoc(docClient)
const querySnapshot = await getDocs(collectionAddresses);
console.log(DataClient.data());
querySnapshot.forEach((doc) => {
console.log(doc.id, " => ", doc.data());
});
我认为操作太多,无法仅提取同一文档中的客户数据
聊天GPT告诉我,如果我使用事务,两个操作都会像一个操作一样执行,他给了我一个不起作用的代码。
但是这段代码是错误的,因为我认为transaction只对文档起作用,而不对集合起作用。
try{
await runTransaction(db,async (transaccion)=>{
var collectionAddresses=collection(doc(db,"Client","aaaa@gmail.com"),"addresses");
var a=await transaccion.get(collectionAddresses);
});
}catch(errors){
console.log(errors);
}
事实上,节点打印了一个控制台错误.....
所以我的问题是,是否有人知道如何在一次操作中获得所有数据?
1条答案
按热度按时间h22fl7wq1#
我怎样才能在一次操作中获得所有数据?
我理解你所说的“一个操作”是指“一个查询”。对于你的数据模型,这是不可能的。你必须查询
client
文档和所有的address
文档。因此,对于您的示例(有3个地址),您将支付4个文档读取。
请注意,从读取次数的Angular 来看,使用事务不会改变任何东西。CHAT GPT的回答不是很好......此AI所指的“一个操作”是指事务中的更改被分组在一个原子操作中,而不是指从/向Firestore DB只有一次读取或一次写入。
一种可能的方法是将地址存储在
client
文档中的Array中,但您必须确保永远不会达到文档的1 MiB最大大小限制。