如何更改存储在 firebase 中的数据的顺序?

How can I alter the order of the data stored in firebase?

目前我正在使用此代码段在我的 firebase 数据库中设置 6 天和每天的一些时间段。

fb.$set({
  monday: {
    name: 'Monday',
    slots: {
      900: {
        time: '9:00am',
        booked: false
      },
      0110: {
        time: '11:00am',
        booked: false
      },
      100: {
        time: '1:00pm',
        booked: false
      },
      300: {
        time: '3:00pm',
        booked: false
      },
      500: {
        time: '5:00pm',
        booked: false
      },
      700: {
        time: '7:00pm',
        booked: false
      }
      }
  },
  tuesday: {
    name: 'Tuesday',
    slots: {
      900: {
        time: '9:00am',
        booked: false
      },
      0110: {
        time: '11:00am',
        booked: false
      },
      100: {
        time: '1:00pm',
        booked: false
      },
      300: {
        time: '3:00pm',
        booked: false
      },
      500: {
        time: '5:00pm',
        booked: false
      },
      700: {
        time: '7:00pm',
        booked: false
      }
      }
  },
  wednesday: {
    name: 'Wednesday',
    slots: {
      900: {
        time: '9:00am',
        booked: false
      },
      0110: {
        time: '11:00am',
        booked: false
      },
      100: {
        time: '1:00pm',
        booked: false
      },
      300: {
        time: '3:00pm',
        booked: false
      },
      500: {
        time: '5:00pm',
        booked: false
      },
      700: {
        time: '7:00pm',
        booked: false
      }
      }
  },
  thursday: {
    name: 'Thursday',
    slots: {
      900: {
        time: '9:00am',
        booked: false
      },
      0110: {
        time: '11:00am',
        booked: false
      },
      100: {
        time: '1:00pm',
        booked: false
      },
      300: {
        time: '3:00pm',
        booked: false
      },
      500: {
        time: '5:00pm',
        booked: false
      },
      700: {
        time: '7:00pm',
        booked: false
      }
      }
  },
  friday: {
    name: 'Friday',
    slots: {
      900: {
        time: '9:00am',
        booked: false
      },
      0110: {
        time: '11:00am',
        booked: false
      },
      100: {
        time: '1:00pm',
        booked: false
      },
      300: {
        time: '3:00pm',
        booked: false
      },
      500: {
        time: '5:00pm',
        booked: false
      },
      700: {
        time: '7:00pm',
        booked: false
      }
      }
  },
  saturday: {
    name: 'Saturday',
    slots: {
      900: {
        time: '9:00am',
        booked: false
      },
      0110: {
        time: '11:00am',
        booked: false
      },
      100: {
        time: '1:00pm',
        booked: false
      },
      300: {
        time: '3:00pm',
        booked: false
      },
      500: {
        time: '5:00pm',
        booked: false
      },
      700: {
        time: '7:00pm',
        booked: false
      }
      }
  }
});

注意顺序。为什么它按字母顺序存储?

当我 return 此数据并在页面上对其进行迭代时,这会成为一个问题,因为日期不是您期望的顺序,而是 return 字母顺序。

有什么办法可以在一定程度上控制它吗?

您需要将函数传递给将执行自定义排序的 orderBy 过滤器。

var myApp = angular.module('myApp',[]);

function MyCtrl($scope) {
    $scope.name = 'Superhero';
    
    $scope.days = [
        { name: 'Monday' },
        { name: 'Tuesday' },
        { name: 'Wednesday' },
        { name: 'Thursday' },
        { name: 'Friday' },
        { name: 'Saturday' },
        { name: 'Sunday' }
    ]
    
    $scope.sortByWeekday = function (day) {
        var weekdays = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday'];
        return weekdays.indexOf(day.name.toLowerCase());
    }
}
<html>
  <head>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
  </head>
  <body ng-app="myApp">
    <div ng-controller="MyCtrl">
      <div ng-repeat="day in days | orderBy:sortByWeekday">{{day.name}}</div>
    </div>
  </body
</html>

我认为您正在寻找 $priority。在 firebase 中排序数据首先由 $priority 完成,其次由 key 完成。 Firebase 中有大量关于 how sorting works 的文档,阅读起来会很好。如果您尝试以预先确定的顺序专门存储数据(并取回数据),我会使用 $priority。

Firebase 数据库存储 JSON 数据。 JSON 对象中的键本质上是无序的。在大多数情况下,Firebase SDK 默认会 return 按字母顺序排列的键。

一般来说,Firebase 建议不要使用数组,但如果这种情况不符合一般建议,您可以这样做:

set({
  1: {
    name: 'Monday',
    slots: {
      900: { time: '9:00am', booked: false },
      1100: { time: '11:00am', booked: false },
      1300: { time: '1:00pm', booked: false },
      1500: { time: '3:00pm', booked: false },
      1700: { time: '5:00pm', booked: false },
      1900: { time: '7:00pm', booked: false }
    }
  },
  2: {
    name: 'Tuesday',
    slots: {
      900: { time: '9:00am', booked: false },
      1100: { time: '11:00am', booked: false },
      1300: { time: '1:00pm', booked: false },
      1500: { time: '3:00pm', booked: false },
      1700: { time: '5:00pm', booked: false },
      1900: { time: '7:00pm', booked: false }
    }
  },
  3: {
    name: 'Wednesday',
    slots: {
      ...

在上面的代码片段中,我还更改了 slots 的键。通过使用 24 小时制时间,它们将按照您希望的方式自动排序。

我在上面发表了评论,在不知道项目范围的情况下很难知道推荐的确切方向。但是,使用日期名称作为键并将时间存储为字符串可能不会长期有效。

简单的答案是将时间slot/event的日期和时间存储为时间戳,格式如YYYYmmddHHMMSS,作为槽的子节点。

例如

training_classes
   training_id_1234
     timestamp: 20151031130000
     trainer: trainer_id1234
     client: client_id1234
     comment: "Algebra 1"
   training_id_3445
     timestamp: 20151031150000
     trainer: trainer_id1234
     client: client_id1234
     comment: "Algebra 2"

使用此结构,您可以轻松查询 10 月 31 日星期六的所有 类。在上面的例子中有两个,一个在下午 1 点,一个在下午 3 点。

其他时间没有数据,因此可以在 firebase 中预订(无需存储 booked:false)。

您还可以轻松地对它们进行排序,因为时间戳始终按时间顺序排列 - 它存储在 Firebase 中的顺序无关紧要。

此外,它使更改训练项目变得非常容易。只需更新时间戳和 whammo,它已重新安排。