2017-08-18 41 views
1

我有以下数据库结构:AngularFire2 orderByKey和startAt

{ 
"users" : { 
    "ap1-AXLKSD9ASLKDJJ0991" : { 
     "enabled" : true, 
     "color" : "red" 
    }, 
    "ap1-A778ASDUASDJ8AS8DA" : { 
     "enabled" : true, 
     "color" : "blue" 
    }, 
    "ap2-ASD88ASD8ASD8HAS8D" : { 
     "enabled" : true, 
     "color" : "red" 
    } 
    } 
} 

我试图让谁拥有一键启动与“ap1-”的所有用户,如下所示:

import { Injectable } from '@angular/core'; 

import { AngularFireDatabase, FirebaseListObservable } from 'angularfire2/database'; 

import * as firebase from 'firebase/app'; 

import { Observable } from 'rxjs/Observable'; 

@Injectable() 
export class FirebaseService { 
    // 
    // Database 
    userList: FirebaseListObservable<any>; 

    public constructor(
     public afDb: AngularFireDatabase) { 
    } 

    getUsers() { 
     return this.userList = this.afDb.list('/users', { 
      preserveSnapshot: true, 
      query: { 
       orderByKey: true, 
       startAt: 'ap1-' 
      } 
     }); 
    } 
} 

的上面的代码会返回ap1和ap2键。我在网上搜索,找不到任何方法来实现这一点。

我试着与equalTo ..当我把确切的正确的关键,它只发现了这一点。当我放入一个无意义的密钥时,它什么也找不到。

好像startAt有bug?

回答

2

你不能用这样的firebase做到这一点。 “startsWith”所做的是从“ap1-”及其以上的所有密钥中取回所有密钥,而不是以“ap1-”作为第一个字符的字符串。

如果你有一个下列键

{"1", "2", "3", "4"} 

,并质疑它像

startsWith: "3" 

,那么你会得到

{ "3", "4" } 
+0

好了,我怎么就能够实现结果?必须有一种方法来查找所有以特定字符串开头或包含特定字符串的密钥? – flipcode

+1

如果搜索总是相同的,您可以在每个对象上都有一个新值,例如:''ap1-A778ASDUASDJ8AS8DA“:{ ”enabled“:true, ”color“:”blue“,searchPattern:”ap1“ }'然后用'查询:{ orderByChild:是searchPattern, equalsTo: 'AP1' }' – avilao

+0

或者尝试是这样的:https://stackoverflow.com/questions/38618953/how-to-do-一,简单的搜索功能于字符串中,火力数据库 – avilao