【问题标题】:retrieve user based on child keys根据子键检索用户
【发布时间】:2016-02-08 00:01:39
【问题描述】:

我有一个数据结构https://<app name>.firebaseio.com/options 为:

{
    'abc123': {},
    'efg456': {}
}

还有一个https://<app name>.firebaseio.com/users

{
    'test1': {
        options: {'abc123': true}
    },
    'test2': {
        options: {'abc123': true, 'efg456': true}
    }
}

我想根据用户的选项来检索用户。逻辑是:Find <user> where <some option> is found in <user>.<options>

我尝试过类似:users.orderByChild('options').startAt('abc123').endAt('abc123').on('value', (snapshot) => {});;但这给了我null

有什么方法可以实现吗?还是我必须以不同的方式构造数据?

【问题讨论】:

    标签: json firebase firebase-realtime-database


    【解决方案1】:

    您只需要按特定的子键(options/abc123)进行排序,并检查结果是否为true

    > users.on('value', (snapshot) => { console.log(snapshot.val()) })
    
    { test1: { options: { abc123: true } },
      test2: { options: { abc123: true, efg456: true } },
      test3: { options: { efg456: true } } }
    
    > users.orderByChild('options/abc123')
           .equalTo(true)
           .on('value', (snapshot) => { console.log(snapshot.val())})
    
    { test1: { options: { abc123: true } },
      test2: { options: { abc123: true, efg456: true } } }
    
    > users.orderByChild('options/efg456')
           .equalTo(true)
           .on('value', (snapshot) => { console.log(snapshot.val())})
    
    { test2: { options: { abc123: true, efg456: true } },
      test3: { options: { efg456: true } } }
    

    【讨论】:

    • .startAt(true) 有必要吗?我不认为这是因为我只有那个值,因为我需要 abc123 作为键,这样我可以更轻松地进行查询。
    • 其实貌似需要加那个或者equalTo,不然我过滤后的结果是得不到的。
    • @rolandjitsu 如果没有 startWith 或 equalTo,它将返回所有用户,首先是没有密钥的用户,然后是有密钥的用户。
    • 我刚试过equalTo,它似乎返回null。 startAt 按预期工作。
    • 是的,我在那里有不同的值,一些随机字符串,我忘记了。非常感谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    • 1970-01-01
    • 2020-08-21
    • 1970-01-01
    • 2017-01-02
    • 2018-08-18
    相关资源
    最近更新 更多