基于属性存在的Firebase查询(键)

时间:2018-11-28 07:22:02

标签: android firebase nosql google-cloud-firestore

  

我正尝试缩短我的数据。因此,我决定将 userLikeCollection 另存为

true means like and false means dislike->其中neither like nor disliked。如果该文档不存在,则意味着它是db.collection("userLikeCollection").where(questionID ).exist() ...

,其中的ID包含(用户ID +问题ID

现在,我想查询这个问题是否与用户相似。有没有办法实现它。

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

或     阅读该文件,该文件的属性字符串名称为questionID

template<typename H, typename B>
struct A {
    typedef H value_type;

    template<typename I>
    A(B b, I i) {
        std::cout << i << b << std::endl;
    }

    operator int() {
        return 5;
    }
};

int main() {
    int a = A<float>(1, "Hello!");
    return 0;
}
  

其中 userLikeDocument 如下所示

用户ID +问题ID )->文档唯一ID        -questionID = true / false //其中,questionID =每个文档的唯一ID。

编辑问题

UserLikeDocument-1

  • blahblahQuestionIdOne = true;

UserLikeDocument-2

  • blahblahQuestionIdTwo = true;

UserLikeDocument-3

  • blahblahQuestionIdThree = true;

UserLikeDocument-4

  • blahblahQuestionIdFour = true;

1 个答案:

答案 0 :(得分: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。

  

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

这实际上在Firestore中是可能的,但是只有在属性名称不同的情况下,例如questionID拥有布尔值,而id属性则拥有String值。可以通过链接两个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”)和一个带子句的子句   where(“ age”,“>”,30)。

换句话说,Firestore中没有!=(不等于)运算符。正如他们所说,您可以选择将查询分为greater-thanless-than查询,然后将其正常运行。

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

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

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

编辑2:

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