Firestore:子集合假装为空

问题描述 投票:0回答:1

朋友们。在这件事上真的需要你的帮助。我开发了一个使用 Firestore 数据库和存储的 iOS 应用程序。一切都按预期进行。我遇到的问题是使用 Firebase Admin SDK 或 Cloud Functions 传播更改。简而言之,“用户”集合对我的查询有选择地不可见。

我的 Firestore 数据库结构:

  • “用户”(集合,级别 1)-> userID(文档)->“User_Data”(集合)->“UserData”(文档)

  • “Global_Data”(集合,级别 1)->“GlobalData”(文档)

我可以获取 'users' -> 'uid'-> ... 下任何文档/集合的内容,除了 'users' 1 级集合下的内容。

例如,我可以查看/修改集合/文档中的数据:

  • 用户 -> abC4dRefemSow3npM5uG1L2BsTV2 -> User_Data
  • 用户-> abC4dRefemSow3npM5uG1L2BsTV2 -> 用户数据 -> 用户数据
  • 全局数据-> 全球数据
  • 全局_数据

但不是

  • 用户
  • 用户 -> abC4dRefemSow3npM5uG1L2BsTV2

当我尝试直接查看“users”集合中有多少文档时,它返回 0。 当我尝试像这样访问任何用户时,users -> abC4dRefemSow3npM5uG1L2BsTV2,它说该文档不存在。我无法理解为什么。

并且我需要它工作的原因是因为我需要一个函数来循环所有用户并能够修改每个用户的特定文档。

例如,对于用户集合中的每个用户,在“User_Data -> UserData”文档中添加一个字段“X”。 但是,如果我尝试获取用户下的文档数量,它会返回而不循环遍历其中任何一个。

尝试在本地计算机上部署 Cloud Function 和使用 Firebase Admin SDK,结果相同。没有错误。 “用户”是不可见的。

index.js(JavaScript):

const admin = require('firebase-admin');
var serviceAccount = require("./key.json");

admin.initializeApp({
    credential: admin.credential.cert(serviceAccount)
});

const db = admin.firestore(); //with no parameter, using default database


// this works
const userId = 'abC4dRefemSow3npM5uG1L2BsTV2'; //user id

db.collection('users').doc(userId).collection('User_Data').get()
.then((querySnapshot) => {
  console.log("Number of documents retrieved:", querySnapshot.size);

  querySnapshot.forEach((doc) => {
    console.log(`${doc.id} =>`, doc.data());
  });

  if (querySnapshot.empty) {
    console.log("No documents found in 'users' collection.");
  }
})
.catch((error) => {
  console.error("Error getting documents: ", error);
})

当我改变这条线时,

db.collection('users').doc(userId).collection('User_Data').get()

到此

db.collection('users').get()

它不再打印任何结果。就像一个空集合。没有错误。

我更改了 Firestore 安全规则(用于测试):

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if true;
    }
  }
}

此外,我创建了一个服务帐户,获得了一个 json 密钥,并为其授予了所有者权限。这是我的具有权限的 IAM 管理页面的屏幕截图。

非常感谢任何帮助! 谢谢你。

google-cloud-firestore google-cloud-functions google-cloud-storage firebase-admin
1个回答
0
投票

文档可能已被删除。删除文档并不会删除其子集合!

如上所述这里

当您删除文档时,Cloud Firestore 不会自动删除其子集合中的文档。您仍然可以通过引用访问子集合文档。例如,即使您删除了位于

/mycoll/mydoc/mysubcoll/mysubdoc
的祖先文档,您也可以访问路径
/mycoll/mydoc
处的文档。不存在的祖先文档会出现在控制台中,但不会出现在查询结果和快照中。因此,您也许能够查看/修改集合/文档中的数据:

users -> abC4dRefemSow3npM5uG1L2BsTV2 -> User_Data
users -> abC4dRefemSow3npM5uG1L2BsTV2 -> User_Data -> UserData
Global_Data -> GlobalData
Global_Data

但不是

users
users -> abC4dRefemSow3npM5uG1L2BsTV2

如果要删除文档及其子集合中的所有文档,则必须手动执行此操作。有关更多信息,请参阅删除收藏集

© www.soinside.com 2019 - 2024. All rights reserved.