如何在Firebase或同等版本中执行“AND”语句?

时间:2016-10-27 20:27:55

标签: javascript angularjs firebase firebase-realtime-database

我需要进行查询,我只能使用'AND'语句或等效语句来显示特定数据。我已经采用了Firebase文档中显示的示例。

// Find all dinosaurs whose height is exactly 25 meters.
var ref = firebase.database().ref("dinosaurs");
ref.orderByChild("height").equalTo(25).on("child_added", function(snapshot)    {
console.log(snapshot.key);
});

我知道这条线将会检索所有高度正好为25的恐龙,但是我需要显示所有恐龙,其高度为“25”名称为“Dino”。有没有办法检索这些信息?

提前致谢。

2 个答案:

答案 0 :(得分:1)

实际上,firebase仅支持使用一个属性进行过滤/排序,但是如果您想要使用多个属性进行过滤,就像您说我想要使用agename进行过滤,则必须使用复合键。

有一个名为querybase的第三方库,它为您提供了一些多属性过滤功能。见https://github.com/davideast/Querybase

答案 1 :(得分:0)

您无法通过多个键进行查询。 如果您需要按两个属性排序,您的选项是:

  1. 创建混合密钥。参考你的例子,如果你想获得所有'Dino'和高度'25'那么你将创建一个混合的name_age键,它看起来像_onChangeEvent(str) { var self = this; var str = String(str) || ''; var toBeCanceled = null; // set state return false if no str // and shift off last request if (!str) { if (this.requestQueue.length > 0) { toBeCanceled = this.requestQueue.shift(); toBeCanceled.cancel(); } this.setState({results: [], loading: false, value: ''}); return false; } else { this.setState({loading: true, value: str}); } // setup a cancelable promise and add it to the queue // this API spoofer should eventually be a dispatch prop var cancelable = CancelablePromise(APISpoofer(str)); cancelable .promise .then((res) => { var sorted = res.found.sort((a, b) => { var nameA = a.toLowerCase(), nameB = b.toLowerCase(); if(nameA < nameB) return -1; if(nameA > nameB) return 1; return 0; }).slice(0, 4); // set state and shift queue when resolved return self.setState({ results: sorted, loading: false, value: str }, () => { self.requestQueue.shift(); }); }) .catch((err) => { return err; }); // check len of requestQueue and push if(this.requestQueue.length === 0) { this.requestQueue.push(cancelable); } else { // cancel previous and push toBeCanceled = this.requestQueue.shift(); toBeCanceled.cancel(); this.requestQueue.push(cancelable); } } 。这将允许您查询和搜索具有完全相同值但仍失去订购能力的项目(即年龄小于x)。
  2. 在Firebase和其他客户端执行一次查询。您可以在Firebase上按名称进行查询,然后迭代结果并保留与年龄25相匹配的结果。
  3. 在不了解您的架构的情况下,我建议您确保充分展示您的数据。通常我发现可以通过查看我如何存储数据来解决许多多级查询。情况并非总是如此,有时您可能只需采取我上面提到的其中一条路线。