【问题标题】:Firebase query on the basis of attribute exist(key)基于属性exist(key)的Firebase查询
【发布时间】:2019-04-30 01:06:39
【问题描述】:

当我试图缩短我的数据。所以我决定将 userLikeCollection 保存为

questionID = true/false -> 其中true means like and false means dislike。如果此文档不存在,则表示它是neither like nor disliked...

ID 由 (userID + questionID)

组成

现在我想查询这个问题是否是用户喜欢的。有没有办法实现它。

db.collection("userLikeCollection").where(questionID ).exist() 

或 读取具有属性字符串名称 questionID 的文档

db.collection("userLikeCollection").whereStringProperty(questionID).exist()

userLikeDocument 如下所示

(userID + questionID) -> 文档唯一 ID - questionID = true/false //其中 questionID = 每个文档的任何唯一 ID。

编辑问题

UserLikeDocument - 1

  • blahblahQuestionIdOne = true;

UserLikeDocument - 2

  • blahblahQuestionIdTwo = true;

UserLikeDocument - 3

  • blahblahQuestionIdThree = true;

UserLikeDocument - 4

  • blahblahQuestionIdFour = true;

【问题讨论】:

    标签: android firebase nosql google-cloud-firestore


    【解决方案1】:

    现在我想查询这个问题是否是用户喜欢的。有没有办法实现它。 db.collection("userLikeCollection").where(questionID).exist()

    是的,有。要解决这个问题,您应该使用查询和get() 调用。在代码中它看起来像这样:

    Query query = db.collection("userLikeCollection").whereEqualTo("questionID", true);
    query.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
        @Override
        public void onComplete(@NonNull Task<QuerySnapshot> task) {
            if (task.isSuccessful()) {
                for (QueryDocumentSnapshot document : task.getResult()) {
                    if (document.exists()) {
                        Boolean questionID = document.getBoolean("questionID");
                    }
                }
            }
        }
    });
    

    在此代码中,查询将帮助您查找其中questionID 属性将包含true 值的所有文档,并且使用document.exists() 将帮助您查找该文档是否确实存在。

    或读取具有属性字符串名称 questionID 的文档 db.collection("userLikeCollection").whereStringProperty(questionID).exist()

    在这种情况下,您还应该使用查询,但不应将布尔值传递给 whereEqualTo() 方法,而应传递文字字符串:

    Query query = db.collection("userLikeCollection").whereEqualTo("questionID", id);
    

    其中id 包含一个String 类型的值,这是您要查找的问题的实际ID。

    (userID + questionID) -> 文档唯一 ID - questionID = true/false //其中 questionID = 每个文档的任何唯一 ID。

    这在 Firestore 中实际上是可能的,但前提是属性的名称不同,例如 questionID 包含一个布尔值和一个 id 属性包含一个字符串值。这可以通过像这样链接两个 whereEqualTo() 调用来完成:

    Query query = db.collection("userLikeCollection")
        .whereEqualTo("questionID", true)
        .whereEqualTo("id", id);
    

    编辑:

    根据您的评论:

    whereEqualTo("questionID", true) 只在喜欢的时候出现,不喜欢的时候出现。它不会被检索到

    没错。为了解决您的问题,根据Query limitations的官方文档:

    Cloud Firestore 不支持以下类型的查询:

    • 带有 != 子句的查询。在这种情况下,您应该将查询拆分为大于查询和小于查询。例如, 虽然不支持查询子句 where("age", "!=", "30"), 您可以通过组合两个查询来获得相同的结果集,一个与 子句 where("age", "”,30)。

    也就是说,Firestore 中没有 !=(不等于)运算符。正如他们所说,您可以选择将您的查询拆分为 greater-thanless-than 查询,然后它就可以正常工作了。

    您还可以创建另一个查询,如下所示:

    Query query = db.collection("userLikeCollection").whereEqualTo("questionID", false);
    

    在这种情况下,您会得到questionID 属性为假的问题。

    编辑2:

    根据您编辑的问题,Firestore 中无法根据动态 id 过滤文档。也没有办法使用通配符。属性应具有相同的名称。

    【讨论】:

    • whereEqualTo("questionID", true) 仅在喜欢但不喜欢时才出现。它不会被检索
    • 查看我编辑的问题。每个文档都有唯一的 questionID 属性
    • 表示无法根据属性键获取结果。
    • 不,没有。您不能使用动态属性名称。请再次查看我的更新答案。
    • 如果您认为我的回答对未来的访客也有帮助,也请考虑投票。我会很感激的。谢谢!
    猜你喜欢
    • 2018-05-12
    • 1970-01-01
    • 1970-01-01
    • 2017-10-20
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    • 2016-10-31
    • 2017-05-15
    相关资源
    最近更新 更多