Firebase数据库 - 按ID列表查询

Mar*_*ark 6 android firebase-realtime-database

我最近开始将我的应用从Parse切换到Firebase.到目前为止,一切都很顺利,但是我无法找到与Parse的whereContainedIn(String键,Collection值)相同的Firebase方法.

这是一个非常有用的方法,它允许我传入一个id数组,它将返回匹配该id的所有行.到目前为止,使用Firebase,我让它返回数据库中的所有行,然后循环遍历它们以查看该行的id是否包含在我的id数组中.另一种方法是单独查询每个id,这对Firebase的异步行为不起作用.这就是我现在为第一种方法所做的事情:

List<String> userIds = new ArrayList<>();
userIds.add("2");
userIds.add("32");
userIds.add("12545");
userIds.add("187");

DatabaseReference firebaseRef = FirebaseDatabase.getInstance().getReference();
Query queryRef = firebaseRef.child("videos");

queryRef.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {

        List<Video> usersVideos = new ArrayList<Video>();

        for (DataSnapshot videoSnapshot : dataSnapshot.getChildren()) {
            Video video = videoSnapshot.getValue(Video.class);

            if (userIds.contains(video.userId)) {
                usersVideos.add(video);
            }
        }

        // usersVideos is now populated with the videos for the users

    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        Log.d(TAG, "CANCELLED");
    }
});
Run Code Online (Sandbox Code Playgroud)

这些方法都不合理,因为我的表将包含数十万条记录.

任何帮助将不胜感激!

Cha*_*ham 1

创建另一个可以查找的引用,userId并让它返回videoIds该用户拥有的所有内容。从那里您可以查询视频。这意味着每次保存时都需要在两个位置保存。有点痛苦,但这是 Firebase 推荐的。

所以你的参考看起来更像是:

videos -
       | - <videoId> - 
             | - <video stuffs>
             | - userId
videosByUser -
       | - <userId> -
                    | 0 - <videoIdA>
                    | 1 - <videoIdB>
       | - <userId2> -
                    | 0 - <videoIdA>   
Run Code Online (Sandbox Code Playgroud)