我需要进行查询,我只能使用'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”。有没有办法检索这些信息?
提前致谢。
答案 0 :(得分:1)
实际上,firebase仅支持使用一个属性进行过滤/排序,但是如果您想要使用多个属性进行过滤,就像您说我想要使用age
和name
进行过滤,则必须使用复合键。
有一个名为querybase的第三方库,它为您提供了一些多属性过滤功能。见https://github.com/davideast/Querybase
答案 1 :(得分:0)
您无法通过多个键进行查询。 如果您需要按两个属性排序,您的选项是:
_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)。在不了解您的架构的情况下,我建议您确保充分展示您的数据。通常我发现可以通过查看我如何存储数据来解决许多多级查询。情况并非总是如此,有时您可能只需采取我上面提到的其中一条路线。