{
  "movies": {
    "movie1": {
      "genre": "comedy",
      "name": "As good as it gets",
      "lead": "Jack Nicholson"
    },
    "movie2": {
      "genre": "Horror",
      "name": "The Shining",
      "lead": "Jack Nicholson"
    },
    "movie3": {
      "genre": "comedy",
      "name": "The Mask",
      "lead": "Jim Carrey"
    }
  }
}

我是Firebase的新手。我如何从上面的数据中检索一个结果类型= '喜剧'和领导= '杰克尼克尔森'?

我有什么选择?


当前回答

firebase实时数据库中的数据为_InternalLinkedHashMap<dynamic, dynamic>。 你也可以把它转换成你的地图和查询非常容易。

例如,我有一个聊天应用程序,我使用实时数据库来存储用户的uid和bool值,无论用户是否在线。如下图所示。

现在,我有一个类RealtimeDatabase和一个静态方法getAllUsersOnineStatus()。

static getOnilineUsersUID() {
var dbRef = FirebaseDatabase.instance;
DatabaseReference reference = dbRef.reference().child("Online");
reference.once().then((value) {
  Map<String, bool> map = Map<String, bool>.from(value.value);
  List users = [];
  map.forEach((key, value) {
    if (value) {
      users.add(key);
    }
  });
  print(users);
});

}

输出[NOraDTGaQSZbIEszidCujw1AEym2]

我是扑球新手,如果你知道更多请更新答案。

其他回答

firebase实时数据库中的数据为_InternalLinkedHashMap<dynamic, dynamic>。 你也可以把它转换成你的地图和查询非常容易。

例如,我有一个聊天应用程序,我使用实时数据库来存储用户的uid和bool值,无论用户是否在线。如下图所示。

现在,我有一个类RealtimeDatabase和一个静态方法getAllUsersOnineStatus()。

static getOnilineUsersUID() {
var dbRef = FirebaseDatabase.instance;
DatabaseReference reference = dbRef.reference().child("Online");
reference.once().then((value) {
  Map<String, bool> map = Map<String, bool>.from(value.value);
  List users = [];
  map.forEach((key, value) {
    if (value) {
      users.add(key);
    }
  });
  print(users);
});

}

输出[NOraDTGaQSZbIEszidCujw1AEym2]

我是扑球新手,如果你知道更多请更新答案。

Frank的回答很好,但是Firestore最近引入了数组包含,使得进行AND查询更容易。

您可以创建一个filters字段来添加筛选器。您可以根据需要添加任意多的值。例如,通过喜剧和杰克·尼克尔森过滤,你可以添加值comedy_杰克·尼克尔森,但如果你也想通过喜剧和2014,你可以添加值comedy_2014,而不需要创建更多字段。

{
  "movies": {
    "movie1": {
      "genre": "comedy",
      "name": "As good as it gets",
      "lead": "Jack Nicholson",
      "year": 2014,
      "filters": [
        "comedy_Jack Nicholson",
        "comedy_2014"
      ]
    }
  }
}
ref.orderByChild("lead").startAt("Jack Nicholson").endAt("Jack Nicholson").listner....

这是可行的。

Firebase不允许使用多个条件进行查询。 然而,我确实找到了一个解决方法:

我们需要从数据库下载初始过滤数据,并将其存储在一个数组列表中。

                Query query = databaseReference.orderByChild("genre").equalTo("comedy");
                databaseReference.addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                        ArrayList<Movie> movies = new ArrayList<>();
                        for (DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()) {
                            String lead = dataSnapshot1.child("lead").getValue(String.class);
                            String genre = dataSnapshot1.child("genre").getValue(String.class);

                            movie = new Movie(lead, genre);

                            movies.add(movie);

                        }

                        filterResults(movies, "Jack Nicholson");

                        }

                    }

                    @Override
                    public void onCancelled(@NonNull DatabaseError databaseError) {

                    }
                });

一旦我们从数据库中获得了初始过滤数据,我们需要在后端进行进一步的过滤。

public void filterResults(final List<Movie> list,  final String genre) {
        List<Movie> movies = new ArrayList<>();
        movies = list.stream().filter(o -> o.getLead().equals(genre)).collect(Collectors.toList());
        System.out.println(movies);

        employees.forEach(movie -> System.out.println(movie.getFirstName()));
    }
var ref = new Firebase('https://your.firebaseio.com/');

Query query = ref.orderByChild('genre').equalTo('comedy');
query.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot movieSnapshot : dataSnapshot.getChildren()) {
            Movie movie = dataSnapshot.getValue(Movie.class);
            if (movie.getLead().equals('Jack Nicholson')) {
                console.log(movieSnapshot.getKey());
            }
        }
    }

    @Override
    public void onCancelled(FirebaseError firebaseError) {

    }
});