【问题标题】:create multiple nested collection firestore android创建多个嵌套集合firestore android
【发布时间】:2021-07-08 06:01:22
【问题描述】:

我想创建一个嵌套集合,因为我想存储比文档地图所能包含的更多的字段。我的文档名称已定义,以便我可以在基于名称的路径上获取数据。所以我不想创建一个动态名称。由于名称有限,并且这些字段下可能有很多字段,我认为集合是更好的选择。

如果没有数据集父文档,嵌套集合将不会创建。设置数据对我来说似乎没有必要。但我想设置创建日期。并在该文档上添加集合。但似乎我无法在一个定义的路径中创建所有这些。代码会解释更多:

val db = Firebase.firestore
val where = "Denvar" 
val what = "WalkingOrRunning"

val docData = hashMapOf( 
        "date" to Timestamp(Date()),
         "duration" to "10 min"
        "comment" to "Dummy comment"
    )

        //document who got fields like name, UsersActivity got doc Start date previously set.
        val userPath = db.collection("Users").document(who)
        .collection("UsersActivity").document("history").set(docData) // want to continue next line here but that will create empty document thus collection will not save so adding dummy fields


        userPath.collection(what).document(where).set(docData)  // this does not create collection either

那么您对我的数据结构有何建议?

【问题讨论】:

    标签: android firebase kotlin google-cloud-firestore


    【解决方案1】:

    但似乎我无法在一个定义的路径中创建所有这些。

    你不能一次完成。您需要创建两个不同的操作。这是因为,在以下代码行中:

    val userPath = db.collection("Users").document(who)
        .collection("UsersActivity").document("history").set(docData)
    

    “userPath”对象的类型是Task<Void>,因为这是DocumentReference#set(Object data) 方法返回的对象类型。因此,您无法继续在其后链接其他 .collection().document() 方法调用,因为 Task 类不包含此类方法。为了实现您想要的,您需要创建两个单独的操作并重用“userPath”对象,如下所示:

    val userPath = db.collection("Users").document(who)
        .collection("UsersActivity").document("history")
    

    现在“userPath”对象的类型为DocumentReference,之后您可以调用 set() 并将对象添加到数据库中:

    userPath.set(docData).addOnCompleteListener(/* ... /*)
    

    现在要在history 文档的子集合中添加新文档,下面的代码行就可以了:

    userPath.collection(what).document(where).set(docData).addOnCompleteListener(/* ... /*)
    

    【讨论】:

    • 感谢您的回答。我在那里犯了一个愚蠢的错误。一切正常。
    • 很高兴听到一切正常。你很受欢迎。
    • 但是,每次我想将数据添加到该确切路径时,我都必须设置一些数据,但第一次添加就可以了。消除获取该文档以查看它是否存在的需要。如果它可以创建不存在的集合,它将消除不必要的写入需求。
    • 如果我需要获取数据来检查是否存在,这会每次创建一个读取计数,每次设置一个小数据不是更好/相似吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 1970-01-01
    • 2023-01-19
    • 2021-09-13
    相关资源
    最近更新 更多