如何根据另一个节点中的数据对 Firebase 阵列进行排序

How can I order my Firebase array according to data in another node?

本文关键字:Firebase 阵列 排序 数据 何根 另一个 节点      更新时间:2023-09-26

我在Firebase中有一些非规范化的实体,如下所示:

projects
  -KFsomething
    name: "foo"
  -KFwhatever
    name: "bar"
users
  UID-1234
    name: "Bob"
  UID-5678
    name: "Alice"
observations
  -KFblah
    project: -KFwhatever
    user: UID-1234
    timestamp: 1234567890
  -KFrandom
    project: -KFsomething
    user: UID-5678
    timestamp: 1234567899

等等,和其他孩子一起。还有其他具有类似关系的实体。我需要能够在网页上显示用户、项目或其他内容的列表,按他们最近的相关观察进行排序。因此,用户将被排序为Alice,然后是Bob,因为Alice具有更新的观察结果。同样,项目将被排序 foo 然后是 bar,因为较新的观察属于 foo。

如何使用非规范化数据执行此操作?确定排序顺序的参数不属于要排序的对象。是否可以对数据执行哪些操作以使其更容易,或者是否需要一些多步骤客户端查询?

在NoSQL中,你通常需要对数据进行建模,以允许你想要的方式使用它。由于您希望按用户最近的观察结果显示用户,因此应存储每个用户的最新观察结果的时间戳。

projects
  -KFsomething
    name: "foo"
    mostRecentObservationTimestamp: 1234567899
  -KFwhatever
    name: "bar"
    mostRecentObservationTimestamp: 1234567890
users
  UID-1234
    name: "Bob"
    mostRecentObservationTimestamp: 1234567890
  UID-5678
    name: "Alice"
    mostRecentObservationTimestamp: 1234567899
observations
  -KFblah
    project: -KFwhatever
    user: UID-1234
    timestamp: 1234567890
  -KFrandom
    project: -KFsomething
    user: UID-5678
    timestamp: 1234567899

您通常会在发布新观测值时写入该额外信息,并进行多位置更新:

var observation = {
    project: "-KFsomething",
    user: "UID-5678"
    timestamp: 1234567899
};
var updates = {};
var key = ref.push().key();
updates['observations/'+key] = observation;
updates['users/'+observation.user+'/mostRecentObservationTimestamp'] = observation.timestamp;
updates['projects/'+observation.project+'/mostRecentObservationTimestamp'] = observation.timestamp;
ref.update(updates);

请参阅这篇关于客户端扇出的精彩博客文章。