如何根据另一个节点中的数据订购我的Firebase阵列?

时间:2016-04-20 17:24:03

标签: javascript firebase firebase-realtime-database

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

如何使用非规范化数据执行此操作?确定排序顺序的参数不属于正在排序的对象。我可以使用数据来简化数据,还是需要一些多步骤的客户端查询?

1 个答案:

答案 0 :(得分:2)

在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