如何根据另一个节点中的数据对我的 Firebase 数组进行排序?

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

我在 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

等等,还有其他小朋友。还有其他具有类似关系的实体。我需要能够在网页上显示用户、项目或其他内容的列表,这些内容按 他们最近的相关观察 排序。所以用户将被排序为爱丽丝然后是鲍勃,因为爱丽丝有更新的观察。同样,项目将被排序为 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);

看到这个很棒blog post on client-side fan-out