NodeJS 如何获取特定文件firebase firestore的所有数据?[可能是事务?]

dkqlctbz  于 2023-02-18  发布在  Node.js
关注(0)|答案(1)|浏览(103)

我正在一个节点项目中工作,我安装了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);
}

事实上,节点打印了一个控制台错误.....
所以我的问题是,是否有人知道如何在一次操作中获得所有数据?

h22fl7wq

h22fl7wq1#

我怎样才能在一次操作中获得所有数据?
我理解你所说的“一个操作”是指“一个查询”。对于你的数据模型,这是不可能的。你必须查询client文档和所有的address文档。
因此,对于您的示例(有3个地址),您将支付4个文档读取。
请注意,从读取次数的Angular 来看,使用事务不会改变任何东西。CHAT GPT的回答不是很好......此AI所指的“一个操作”是指事务中的更改被分组在一个原子操作中,而不是指从/向Firestore DB只有一次读取或一次写入。
一种可能的方法是将地址存储在client文档中的Array中,但您必须确保永远不会达到文档的1 MiB最大大小限制。

相关问题