热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Firebase没有定义索引

如何解决《Firebase没有定义索引》经验,为你挑选了1个好方法。

我正在使用Firebase来检索用户的一些数据.我只需要用()检索一个用户gameSearching = true.

我的数据如下:

Users
|
|_____ John
|        |___ name: John Farmer
|        |___ gameSearching: true
|
|_____ James
|        |___ name: James Smith
|        |___ gameSearching: false
|
|_____ Barbara
         |___ name: Barbara Smith
         |___ gameSearching: true

我正在运行此代码:

setData(('Users/' + you + '/'), {gameSearching: true});

var ref = new Firebase("https://grootproject.firebaseio.com/Users");
var child = ref.orderByChild("gameSearching");
child.on("child_added", function (data) {
    var yourself = firebase.getAuth().password.email.split("@", 1)[0];
    data.forEach(
        function (childSnapshot) {
            if (childSnapshot[i].val().gameSearching == true && childSnapshot[i].key() != yourself) {
                var oppOnent= childSnapshot[i].key();

                setData(('Users/' + opponent + '/'), {gameSearching: false});
                setData(('Users/' + yourself + '/'), {gameSearching: false});
            }
        }
    );


});

因为'data'有多个值,所以我使用'data.forEach'来分隔它们.在那之后我可以在'true'上设置'return',所以我只会通过'gameSearching:true'接收一个用户.

我的火力基地规则:

{
  "rules": {
    ".read": true,
    ".write": true,
    ".indexOn": "gameSearching"
  }
}

当我运行此代码时,我收到以下错误:

'未捕获错误:没有为gameSearching定义索引'

我已经搜索了使用'.indexOn'设置'gameSearching'的索引,但没有任何成功. https://www.firebase.com/docs/security/guide/indexing-data.html

有没有人有例子或解决方案?


编辑:

我现在得到以下代码:

var ref = new Firebase("https://grootproject.firebaseio.com/Users");
    ref.orderByChild("gameSearching").equalTo(true).limitToFirst(1).on("child_added", function (data) {
        var yourself = firebase.getAuth().password.email.split("@", 1)[0];

            var oppOnent= data.key();
            console.log(opponent);

            setData(('Users/' + opponent + '/'), {gameSearching: false});
            setData(('Users/' + yourself + '/'), {gameSearching: false});
            console.log('ja');
    });

我编辑了我的firebase规则:

{
"rules": {
    ".read": true,
    ".write": true,
    "Users": {
  ".indexOn": "gameSearching"
}
}

}

indexOn错误不再显示,所以这很好.但是ref.orderByChild("gameSearching").equalTo(true).limitToFirst(1)会运行两次.我不知道怎么可能.我正在使用limitToFirst(1)`,所以我希望有一个孩子?



1> Frank van Pu..:

现在你已经添加了规则,很清楚那里有什么问题.

这些是您目前的规则:

{
  "rules": {
    ".read": true,
    ".write": true,
    ".indexOn": "gameSearching"
  }
}

因此,您允许每个人在整个Firebase上进行读写访问,并告诉它添加索引gameSearching.问题是您已将索引定义在顶级,而不是在Firebase中需要的级别.

这是您当前的数据结构:

{
    "Score" : {
        "sam_lous" : {
            "score" : 2
        }
    },
    "Users" : {
        "hallo" : {
            "gameSearching" : true
        },
        "sam_lous" : {
            "gameSearching" : true
        },
        "test" : {
            "gameSearching" : false
        },
        "test2" : {
            "gameSearching" : true
        }
    }
}

gameSearching属性仅存在于Users节点的子节点下.这就是你应该定义你的地方.indexOn:

{
  "rules": {
    ".read": true,
    ".write": true,
    "Users": {
      ".indexOn": "gameSearching"
    }
  }
}

这样,您的索引应该被创建(根据我的经验,它会在您保存规则时立即发生)并且错误/警告消息应该消失.但是为了解决这个问题,你还应该对我在其他答案中所做的更改进行修改.

我必须承认Firebase的索引数据的文档可能会更明确地定义这些.indexOn规则.如果Firebase的某人正在阅读,您能否添加一些更好的示例,突出显示.indexOn需要在数据所在级别定义?


推荐阅读
author-avatar
终结者
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有