此文档不存在,不会出现在查询或快照中,但结构相同的文档可以正常工作

时间:2017-10-31 20:01:58

标签: database firebase google-cloud-firestore

前言:这个问题已经被问到here,但是用户放弃并给出了第一个答案的解决方案。这个问题也有所不同,我有两个相似的集合结构,但错误只发生在其中一个上。

我正在使用Google的新火库数据库,并创建了以下结构:地区/ {地区列表} /调度/ {调度列表} / {调度信息}

我们正在使用this method使用Firebase Admin SDK在我们的后端创建自定义令牌。当用户登录我们的后端时,我们生成令牌并将他们有权访问的区域添加为附加声明,我们打算从我们的安全规则中的auth / request.auth对象访问这些声明,以限制他们对发送文档的访问权限因此。我提到这个以防我们不正确地进行结构,在这种情况下,请更正我,因为我们是firestore的新手。

我们遇到的问题是其中一个文档发出警告:“此文档不存在,不会出现在查询或快照中”(见下图)。但是,我们有一个相同的文档结构(图像中的文档7),它不会发出此警告,并且会出现在查询和快照中。 enter image description here

6 个答案:

答案 0 :(得分:6)

这告诉您territories/6不存在为实际文档,而territories/7则存在。

在Cloud Firestore中,可以让“虚拟”文档拥有子集 - 即较高级别的文档不存在,但它有子级。

这些虚拟文档可以轻松地组织信息,而无需创建重复的虚拟文档。

在这种情况下,你要么:

  1. 之前在territories/6下创建了一堆调度文档 您创建了territories文档或
  2. 您随后删除了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复制的带有伪造字段的值。Recreate user root node

然后当我重新运行上面的代码片段时,“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)

这通常发生在集合中有空字段时,可以通过在字段中添加一个虚拟值来解决,最好是当前时间戳就足够了。