遍历集合中的文档以获取字段

时间:2020-06-30 10:33:47

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

我在Firebase Firestore中有一个称为用户的集合。集合用户中的每个文档都是在应用程序中注册的用户。每个文档都有一个称为token_ids的字段。如何遍历所有文档以获取token_ids字段中的值。我正在使用Firebase云功能来这样做。这是我尝试使用的代码片段,但没有用:

const functions = require('firebase-functions');
const admin = require ('firebase-admin');
admin.initializeApp();

  //fetch all token ids of users

  const tokenReference = admin.firestore().collection("users");

  const tokenSnapshot  = await tokenReference.get();

  tokenSnapshot.forEach((doc) =>{

    console.log("Token ids are:" + doc.data().token_id);


  });

  });

3 个答案:

答案 0 :(得分:1)

由于Firestore操作是异步的,因此理想情况下,您应该将代码包装在async-await块中。

例如:

async function fetchAllTTokenIds() {

  const tokenReference = admin.firestore().collection("users");
  
  const tokenSnapshot  = await tokenReference.get();
  const results = [];
  // Recommendation: use for-of loops, if you intend to execute asynchronous operations in a loop.
  for(const doc of tokenSnapShot) {
    results.push(doc.data().token_id);
  }
  const tokenIds = await Promise.all(results);
}

通过这种方式,所有tokenIds变量都将填充tokenIds数组。

或者,您也可以并行进行所有异步调用,因为它们使用Promise.allReference)彼此独立

async function fetchAllTTokenIds() {

  const tokenReference = admin.firestore().collection("users");
  
  const tokenSnapshot  = await tokenReference.get();

  const tokenIds = await Promise.all(tokenSnapShot.map(doc => {
    return doc.data()
      .then(data => (data.token_id)) 
  }))

在这种情况下,tokenIds变量将包含所有tokenId的数组。

答案 1 :(得分:1)

花了我一段时间,但终于找到了解决方案。这里是。这是Dhruv Shah提出的第一个解决方案,但稍作修改:

async function fetchAllTTokenIds() {

  const tokenReference = admin.firestore().collection("users");
  
  const tokenSnapshot  = await tokenReference.get();
  const results = [];
  tokenSnapshot.forEach(doc => {

    results.push(doc.data().token_id);

  });

  const tokenIds = await Promise.all(results);

  return console.log("Here =>" +tokenIds);


}


答案 2 :(得分:0)

代码段的结构取决于您使用的是Firebase Admin SDK,是作为在本地计算机上运行的脚本还是由客户端应用程序调用的httpsCallable。对于第一种情况,它是这样写的:

在脚本file.js中,初始化应用程序后,编写以下代码。

exports.test_f = async function() {
  try {

    const tokenReference = admin.firestore().collection("users");

    const tokenSnapshot  = await tokenReference.get();

    tokenSnapshot.forEach((doc) =>{

      console.log("Token ids are:" + doc.data().token_id);


    });
  } catch (error) {
    console.log(error);
  }
}

exports.test_f();

使用命令node file.js在命令行上运行此脚本,它将打印提供的输出