前言:这个问题已经被问到here,但是用户放弃并给出了第一个答案的解决方案。这个问题也有所不同,我有两个相似的集合结构,但错误只发生在其中一个上。
我正在使用Google的新火库数据库,并创建了以下结构:地区/ {地区列表} /调度/ {调度列表} / {调度信息}
我们正在使用this method使用Firebase Admin SDK在我们的后端创建自定义令牌。当用户登录我们的后端时,我们生成令牌并将他们有权访问的区域添加为附加声明,我们打算从我们的安全规则中的auth / request.auth对象访问这些声明,以限制他们对发送文档的访问权限因此。我提到这个以防我们不正确地进行结构,在这种情况下,请更正我,因为我们是firestore的新手。
我们遇到的问题是其中一个文档发出警告:“此文档不存在,不会出现在查询或快照中”(见下图)。但是,我们有一个相同的文档结构(图像中的文档7),它不会发出此警告,并且会出现在查询和快照中。
答案 0 :(得分:6)
这告诉您territories/6
不存在为实际文档,而territories/7
则存在。
在Cloud Firestore中,可以让“虚拟”文档拥有子集 - 即较高级别的文档不存在,但它有子级。
这些虚拟文档可以轻松地组织信息,而无需创建重复的虚拟文档。
在这种情况下,你要么:
territories/6
下创建了一堆调度文档
您创建了territories
文档或territories/6
而未删除子收集文件。答案 1 :(得分:6)
不确定这会解决您的问题,但确实如此...控制台中的消息:如果文档只有子集但没有字段,我似乎会出现"This document does not exist, it will not appear in queries or snapshots"
(我想这被称为“虚拟”文档)。
我使用set
方法在现有的“虚拟”文档上添加虚拟字段(json对象),这使得它们可以通过快照或查询被发现。它没有覆盖/删除这些文档的任何子集合。无法通过控制台添加字段。
我的代码:
var docRef = this.fsdb.collection('sessions')
//do for all "virtual" docs in collection
docRef.doc('mySession1').set({dummy: 'dummy'})
docRef.onSnapshot(val => {
var mySessionsArray: any [] = []
val.forEach(myDoc => {
mySessionsArray.push(myDoc.id)
})
console.log(mySessionsArray)
})
console:["mySession1", "mySession2", "mySession3"]
免责声明,而非交易程序员: - )
答案 2 :(得分:1)
我能够修复这个错误,接受的答案目前只解释了原因并且没有提供修复。以下是在我的Firestore根目录下没有“users”集合的情况下尝试运行此错误时导致该错误的代码(对我而言):
db.collection("users").document(currentUserUID).collection("groups").addDocument(data: [
"groupID": newGroup.documentID,
"userAddDate": NSDate()
])
创建的currentUserUID文档抛出了“文档不存在”虚拟错误。我复制了currentUserUID并删除了用户集合和虚拟UserUID文档。
然后我在根节点创建了一个新的'users'集合,并粘贴了我为userUID复制的带有伪造字段的值。
然后当我重新运行上面的代码片段时,“groups”集合和文档被重新添加没问题:)
答案 3 :(得分:0)
这是我的理解方式。在Firebase Cloud Firestore中,您可以创建文档而无需创建其父文档。换句话说,无需事先创建“ mydoc”就可以添加“ mysubdoc”。
[Kotlin]
FirebaseFirestore.getInstance()
.document("/mycoll/mydoc/mysubcoll/mysubdoc").set(hashMapOf("key", "value"))
如果这样做,没有任何危害,只不过您收到“此文档不存在,不会出现在查询或快照中”警告,并且可能某些查询可能无法按预期运行。
相反,删除文档不会删除其子集合。有关更多信息,请参见https://firebase.google.com/docs/firestore/manage-data/delete-data。
如果要创建父文档,则可以执行以下操作;创建一个具有空值的文档。
FirebaseFirestore.getInstance()
.document("/mycoll/mydoc").set(hashMapOf<String, String>())
确保正确设置了读/写规则,特别是如果您将用户ID用作文档路径的一部分,以防止未经授权的用户窥探到他们。
如果只是一次性交易,您也可以从Firebase控制台创建“ mydoc”。
答案 4 :(得分:0)
简单修复
文档至少需要一个字段才能存在。如果文档仅包含子集合,则称该文档为虚拟/不存在的文档,因此,该文档不可能出现在查询或数据快照中。
考虑添加这样的字段
// initialize firestoreDatabase
val firestoreDatabase : FirebaseFirestore? by lazy { FirebaseFirestore.getInstance() }
// set at least one field
firestoreDatabase.collection("territories").
document("6").
set(hashMapOf(
"key" to "value"))
执行与数据库中任何其他文档类似的操作。
答案 5 :(得分:0)
这通常发生在集合中有空字段时,可以通过在字段中添加一个虚拟值来解决,最好是当前时间戳就足够了。