【问题标题】:How to get document one time and using it every where如何一次获取文档并在任何地方使用它
【发布时间】:2022-01-31 22:42:12
【问题描述】:

我使用 firebase admin 并使用 nodejs 通过电话号码从 firebase 获取数据。当我获得成功时,我只想获得一次文档并每次都使用它。有可能吗?

图片:

首先我通过电话获得文件的样子。 示例:

const phone = await admin.firestore().collection('users').where('phone_number', '==', phone).get()

之后,我希望每次在我的代码中使用文件电话看起来像:

await handleLogic(phone)

然后

 async function handleLogic(phone) {
   //inside here i need call await admin.firestore().collection('users').where('phone_number', '==', somePhone).get() or re use phone in parameter ?  
 phone.ref.collection("subcollection").get()
        .then(() => {
            let data = {
                
                created_at: timeNowFirebase(),
            };

            phone.ref.collection(subcollection).doc(someId)
                .set(data);
  }

我有一个问题:在函数 handleLogic(phone) 内部,我需要重新调用 admin.firestore().collection('users').where('phone_number', '==', phone).get( ) 或仅使用参数 phone 并使用 phone.ref.collection(subcollection).doc(someId).set(data); 。它会将子集合设置为我的手机正确吗?

【问题讨论】:

  • 您能否分享您的文档截图并说明您要从哪里复制数据以及复制到哪里?
  • 你用缓存怎么样
  • @Dharmaraj 我刚刚更新了图片。我只是质疑当我使用 phone.ref.collection("subcollection").get() 我需要重新调用 await admin.firestore().collection('users').where('phone_number', '==', phone ).get() 或不调用它。 phone.ref.collection("subcollection").get() 将自动通过电话号码获取正确的文档?
  • @JatinMehrotra 为什么我需要在这种情况下使用缓存
  • 您首先在哪里运行phone 查询?如果您可以按运行顺序共享代码,那么它可能会帮助我们了解您到底在问什么?

标签: node.js firebase google-cloud-firestore


【解决方案1】:

是的,您可以将文档 ID(甚至是当前的 DocumentReference)存储在内存/缓存中,而不是每次都使用电话号码查询文档。文档 ID 永远不会改变,这似乎是防止对数据库的额外请求的好方法。

// storing in memory for example
const phoneToUserId = {};

async function handleLogic(phone) {
  if (!phoneToUserId[phone]) {
    // run a query to get userID from phone number
    const user = await admin.firestore().collection('users').where('phone_number', '==', somePhone).get()
    phoneToUserId[phone] = user.docs[0].id
  } 

  // get a reference to sub-collection
  const subCol = admin.firestore().collection(`users/${phoneToUserId[phone]}/subcollection`)
  // query data
}

但是请注意,每当用户更新他们的电话号码或删除他们的文档时,您都必须更新该对象。

【讨论】:

  • 这意味着我的帖子中的代码正确吗?当我使用 phone.ref.collection("subcollection").get() .then 它工作正常
  • @BaoTrungTran 是的,也可以。我的意思是phone.ref 的价值永远不会改变。但同样,如果您要存储多个用户的数据,那么您将不得不使用 map。否则 phone.ref 将始终具有相同的值。目前尚不清楚您如何存储第一次查询的数据..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多