{
  "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的新手。我如何从上面的数据中检索一个结果类型= '喜剧'和领导= '杰克尼克尔森'?

我有什么选择?


当前回答

对于云壁炉

https://firebase.google.com/docs/firestore/query-data/queries#compound_queries

复合查询 您可以将多个相等操作符(==或数组包含)方法链接起来,以创建更具体的查询(逻辑与)。但是,您必须创建一个复合索引来将相等操作符与不等操作符、<、<=、>和!=组合在一起。

citiesRef.where('state', '==', 'CO').where('name', '==', 'Denver');
citiesRef.where('state', '==', 'CA').where('population', '<', 1000000);

你可以只在一个字段上执行range(<, <=, >, >=)或not equals(!=)比较,并且在复合查询中你最多可以包含一个array-contains或array-contains-any子句:

其他回答

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....

这是可行的。

对于云壁炉

https://firebase.google.com/docs/firestore/query-data/queries#compound_queries

复合查询 您可以将多个相等操作符(==或数组包含)方法链接起来,以创建更具体的查询(逻辑与)。但是,您必须创建一个复合索引来将相等操作符与不等操作符、<、<=、>和!=组合在一起。

citiesRef.where('state', '==', 'CO').where('name', '==', 'Denver');
citiesRef.where('state', '==', 'CA').where('population', '<', 1000000);

你可以只在一个字段上执行range(<, <=, >, >=)或not equals(!=)比较,并且在复合查询中你最多可以包含一个array-contains或array-contains-any子句:

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]

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

我已经编写了一个个人库,允许您按多个值进行排序,所有排序都在服务器上完成。

见到Querybase !

Querybase接受一个Firebase数据库引用和一个字段数组,你想在上面建立索引。当您创建新记录时,它将自动处理允许多次查询的键的生成。需要注意的是,它只支持直接等价(不小于或大于)。

const databaseRef = firebase.database().ref().child('people');
const querybaseRef = querybase.ref(databaseRef, ['name', 'age', 'location']);

// Automatically handles composite keys
querybaseRef.push({ 
  name: 'David',
  age: 27,
  location: 'SF'
});

// Find records by multiple fields
// returns a Firebase Database ref
const queriedDbRef = querybaseRef
 .where({
   name: 'David',
   age: 27
 });

// Listen for realtime updates
queriedDbRef.on('value', snap => console.log(snap));