javascript - 在 Firebase 中跨子数组搜索

标签 javascript angularjs firebase firebase-realtime-database angularfire

我的标题不太准确,但我无法说出我遇到的问题。

所以我正在学习如何使用 firebase 和 Angularfire,并且正在学习如何操作数据。

一切都找到了,直到我遇到了这种类型的数组。

enter image description here

这是我的 Firebase 实时数据库,它已经成为历史。

主数组是它本身的历史记录,它由两个数组(0和1)组成,分别指用户0和用户1的历史记录。

在用户 0 的数组中,有他的用户 ID (_ID) 和两个子数组(0 和 1),这两个子数组表示他所做的级别。

每个子数组都有该关卡已完成的次数、该关卡的 ID (_id) 以及几个包含每次运行该关卡的数据的子子数组。

有点复杂!我希望你了解我的数据库。我同意我没有关于如何构建数据库的最佳实践。

我的问题是,我希望为我的 angularjs 应用程序搜索这种类型的数组。

例如,我正在尝试创建这些变量:

$scope.history
$scope.userHistory
$scope.currentLevelUserHistory
$scope.lastRunCurrentLevelUserHistory

我设法获得了前两个变量,但我不明白为什么我不能处理接下来的变量。

获取历史记录非常简单,我只是在我的工厂中使用这个功能

getHistoriques : function () {
    return historiques;
}

其中“历史”指的是这个

var ref = firebase.database().ref().child("historiques");
var historiques = $firebaseArray(ref);

获取 userHistory 有点棘手。

我创建了这个函数

function search(key, array){
    console.log("Searching array with the key : " + key);
    for (var i=0; i < array.length; i++) {
        if (array[i]._id === key) {

            console.log(array[i]);
            return array[i];

        }
        else {

        }
    }
}

输出就是这样的一个对象。

enter image description here

但要进入下一步:currentLevelUserHistory。这对我来说是不可能的。我尝试了 10 种不同的方式,但我无法让它工作。

我的最后一次尝试是在搜索函数中重新注入(inject)前一个对象的输出以及关卡 ID。

但我变得“未定义”。

我尝试了很多事情,比如向我的对象添加一些 [0],添加一堆东西。但我不明白为什么它不起作用。对我来说,数组和子数组始终是相同的。

为什么它不起作用?这是因为函数的输出正在修改我的数组?

我知道我的问题很长。非常感谢所有有勇气阅读这本书的人。

非常感谢。

第一次编辑:

users
    |
    - userId (according to firebase auth)
        |
        - name : ...
        |
        - surname : ...
        |
        - age : ...
        |
        - allowed levels :
                        |
                        - allowedLevel001 : levelId
                        |
                        - allowedLevel002 : levelId
                        |
                        - allowedLevel003 : levelId
        -...

levelsData
    |
    - levelId
        |
        - level name : ...
        |
        - level description : ...
        |
        - first step
            |
            - step name : ...
            |
            - step desc : ...
            |
            - action needed : ...
            |
            - time : ...
        - second step
            |
            - step name : ...
            |
            - step desc : ...
            |
            - action needed : ...
            |
            - time : ...    
    |
        -...    

levelsRunData
    |
    - userId+levelId
        |
        - run001
            |
            -
            first step result :
                |
                - ...
            second step result :
                |
                - ...   
            |
            -...
        - run002
            |
            -
            first step result :
                |
                - ...
            second step result :
                |
                - ...   
            |
            -...    

最佳答案

我想就您的数据库结构提出一些建议。它们基于我认为的您的用例。当然,我可能完全错了。首先,有几点评论:

  1. 您需要将 Firebase RTDB 数据库视为键/值对的映射,而不是数组。它确实允许您将数组发布到数据库,但它会从中创建一系列键/值对,键从 0 开始并以 1 递增(您在当前结构中有点这样做,但我认为它可以导致其他问题)。
  2. 当您需要处理 10 万用户时,您需要考虑数据库应该是什么样子。然后,存储和数据下载量就变得非常重要,否则您的应用将会停止运行,Google 将会向您开出 1000 美元的账单。

恕我直言,您的用户需要通过一个像样的唯一 key 来识别,而不是 0、1、2。从长远来看,这会给您带来麻烦,相信我。许多数据库结构都使用用户通过 Firebase 身份验证对应用程序进行身份验证时创建的 userid - 您应该考虑将其用于数据库中对用户的所有引用。这消除了您针对每个用户存储的 id: 属性,因为它已经在 key 中。

我看不到子子数组 0 和 1 下有哪些数据,但你已经下降了 5 个级别,虽然这是可行的,但在 NoSQL 数据库中深度嵌套并不好。

因此,恕我直言,您的数据库可能如下所示(我假设 historiques 是 root,您不需要保留有关用户的任何其他详细信息,例如姓名、年龄等。如果您这样做,那么您需要一个名为 users 的节点,以 userId 作为键。):

两个数据库节点,称为levelCompleted 和levelRunData。他们看起来像...

levelsCompleted
    |
    - userId
        |
        - levelId001 : levelRunCount
        (number of zeroes in levelId depends on how many possible levels there are)
        |
        - levelId002 : levelRunCount
        |
        -...

levelsRunData
    |
    - userId+levelIdnnn (concatenate the two ids)
        |
        - run001
            |
            - run data (don't know what is in here).
        (number of zeroes in run depends on how many possible runs there are)
        |
        - run002
            |
            - run data
        |
        - run003
            |
            - run data
        |
        -...

然后根据用户的id和级别id读取你需要的数据就变得相当简单了。 希望这是有道理的。

根据您的第一次编辑进行更新:

请参阅下面的建议结构。我现在使用实际的(建议的)属性名称。另外,为了清楚起见,以下是每个节点的建议记录键:

Node            Key Format                                   Name in Structure
----            ---------------------                        -----------------
users           <28 character user id from firebase_auth>    userId
levelsData      <'level'nnn eg. level001, level002>          levelId
levelsRunData   <userId + levelId + 'run'nnn>                N/a

然后我们可以在聊天室中讨论它。

数据库结构:

users
    |
    - userId (according to firebase auth)
        |
        - name : ...
        |
        - surname : ...
        |
        - age : ...
        |
        - allwdLvls
            |
            - level001 : levelRunCount
            |
            - level002 : levelRunCount
            |
            - level003 : levelRunCount
        -...

levelsData
    |
    - level001
        |
        - levelName : ...
        |
        - levelDesc : ...
        |
        - step001
            |
            - stepName : ...
            |
            - stepDesc : ...
            |
            - actionNeeded : ...
            |
            - time : ...
        - step002
            |
            - stepName : ...
            |
            - stepDesc : ...
            |
            - actionNeeded : ...
            |
            - time : ...    
    |
    - level002
        |
        - levelName : ...
        -... 
    -...

levelsRunData
    |
    - <userId>+<levelId>+run001
        |
        - step001
            |
            - ...
            |
            - ...
        |
        - step002
            |
            - ...
            |
            - ...
        |
        -...
    - <userId>+<levelId>+run002
        |
        - step001
            |
            - ...
            |
            - ...
        |
        - step002
            |
            - ...
            |
            - ...
        |
        -...
    |
    -...

关于javascript - 在 Firebase 中跨子数组搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60937268/

相关文章:

javascript - CKEditor 不适用于 Bootstrap 模式

javascript - 在不同的 Controller 文件中使用服务

javascript - 与 Firebase Auth : How to set Persistence? 进行 react

javascript - 如何使 iframe 不保存到 Chrome 中的历史记录?

javascript - 无法解决 Angular js 中与 $http.get 相关的问题

android - 通知图标应用程序背景android

javascript - 使用 Firebase-GeoFire 获取用户附近的餐馆列表

javascript - Parsley 在初始验证调用后阻止 keydown 验证

javascript - 在第三个 div 中显示的两个 div 的自动等式

Javascript 深层复制(值)在数组中不起作用