如何根据另一个节点中的数据对我的 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);
我在 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);