您如何获取Firebase集合中的所有文档(包括不存在的祖先文档)?

时间:2019-04-09 05:23:14

标签: database firebase google-cloud-firestore

我正在尝试提取“用户”集合中的所有文档,但是只提取“ fred”和“ lisa”,而忽略所有斜体的文档:

对于此数据:

enter image description here

尝试获取所有文档:

enter image description here

将产生产量:

info: length 2
info: fred  =>  { gender: 'male', contacts: [ '' ] }
      lisa  =>  { contacts: [ '' ] }

根据Firebase文档(Firebase: Add and Manage Data):

  

警告:即使不存在的祖先文档出现在控制台中,它们也不会出现在查询和快照中。您必须创建文档以将其包含在查询结果中。

注意:当用户单击触发firebase.auth()功能的注册按钮(fredlisa是手动创建的)时,似乎不存在的祖先用户会自动创建)。

如果某些用户未出现在我的查询中,我该如何打印每个用户的contacts?我是否需要定期运行一个手动重新添加所有用户的脚本,还是有一个更优雅的解决方案?

2 个答案:

答案 0 :(得分:1)

正如您所提到的,这些“文档”在Firebase控制台中以斜体显示:这是因为这些文档仅作为一个或多个子集合的“容器”(在控制台中)存在。不是“正版”文件。

事实上,如果您直接在col1集合下创建具有完整路径doc1/subCol1/subDoc1的文档,则不会创建任何中间文档(即没有doc1文档)。 / p>

Firebase控制台以斜体显示这种“容器”(或“占位符”),以便“具体化”层次结构并允许您导航到subDoc1文档,而doc1文档却没有在Firestore数据库中不存在。

让我们举个例子:想象一个doc1集合下的col1文档

col1/doc1/

subDoc1(子)集合下的另一个subCol1

col1/doc1/subCol1/subDoc1

实际上,从技术角度来看,它们根本不相关。他们只是分享自己的道路的一部分,但没有别的。这样做的副作用是如果您删除文档,则其子集合仍然存在

因此,如果您希望能够查询这些父文档,则必须自己创建它们,如评论中提到的jackz314。

答案 1 :(得分:0)

如果您要尝试通过Firebase身份验证列出所有注册用户,则可以使用Firebase SDK功能:

    function listAllUsers(nextPageToken) {
      admin.auth().listUsers(1000, nextPageToken)
        .then(function(listUsersResult){
          listUsersResult.users.forEach(function(userRecord) {
            console.log('user', userRecord.toJSON());
          })
          if (listUsersResult.pageToken) {
            // list next batch of users
          }
        })
        .catch(function(err) {
          console.log('Error listing users: ', error)
        });
    }

    listAllUsers();

通过http://firebase.google.com/docs/auth/admin/manage-users#list_all_users