Firestore查询按时间和分数对帖子进行排序

时间:2018-01-28 08:23:49

标签: java android firebase google-cloud-firestore

我试图通过使用以下代码按时间和业力对它们进行排序来整理趋势帖子:

FirebaseFirestore.getInstance().collection("topics")
    .orderBy("time", com.google.firebase.firestore.Query.Direction.DESCENDING)
    .whereGreaterThanOrEqualTo("time",(System.currentTimeMillis() % 1000)-1000*60*60*24*7)
    .orderBy("karma", com.google.firebase.firestore.Query.Direction.DESCENDING).startAfter(currentDoc).limit(10).get()
                .addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
                    @Override
                    public void onSuccess(QuerySnapshot documentSnapshots) {
                        for (DocumentSnapshot d : documentSnapshots.getDocuments()){
                            Topic topic = new Topic();
                            topic.setId(d.getId());
                            topic.setUsername(d.getString("username"));
                            topic.setCaption(d.getString("caption"));
                            topic.setPic(d.getString("pic"));
                            topic.setTime(d.getLong("time"));
                            topic.setType(d.getString("type"));
                            topic.setImage(d.getString("image"));
                            topics.add(topic);
                            if (topics.size()==documentSnapshots.size()){
                                currentDoc = d;
                                adapter.updateList(topics);
                                loading.setVisibility(View.GONE);
                            }
                        }

                    }
                }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                e.printStackTrace();
            }
        });

我在Firestore中添加了索引。但它没有用。

我的意思是它显示了7天的帖子。但它并没有按业力排序。它按时间排序显示7天的帖子。如果我从查询中删除orderBy(&#34; time&#34;)。它崩溃了。

需要帮助:(

1 个答案:

答案 0 :(得分:2)

查询字词的排序很重要。要解决此问题,请更改以下顺序:

FirebaseFirestore.getInstance().collection("topics")
    .orderBy("karma", com.google.firebase.firestore.Query.Direction.DESCENDING)
    .orderBy("time", com.google.firebase.firestore.Query.Direction.DESCENDING)
    .startAfter(currentDoc).limit(10).get().addOnSuccessListener(/* ... */);

只要您使用 index ,此功能就可以使用。

如您所见,我已从查询中删除了以下代码行:

.whereGreaterThanOrEqualTo("time",(System.currentTimeMillis() % 1000)-1000*60*60*24*7)

因为根据有关Order and limit data with Cloud Firestore的官方文档,您不能:

  

范围过滤器和第一个顺序在不同的字段上。

另一种方法是使用:

FirebaseFirestore.getInstance().collection("topics")
    .orderBy("time", com.google.firebase.firestore.Query.Direction.DESCENDING)
    .whereGreaterThanOrEqualTo("time",(System.currentTimeMillis() % 1000)-1000*60*60*24*7)
    .startAfter(currentDoc).limit(10).get().addOnSuccessListener(/* ... */);

正如您所看到的,orderBywhereGreaterThanOrEqualTo都用在同一个媒体资源上。