Javascript Firebase中的数据过滤

Javascript Firebase中的数据过滤,javascript,firebase,firebase-realtime-database,Javascript,Firebase,Firebase Realtime Database,我正在匹配用户列表中的一个用户,如下所示: export async function getLoginData(uid) { let loginData; const usersRef = await database.ref('users'); const snap = await usersRef.once('value'); snap.forEach((item) => { const itemVal = item.val(); if (item

我正在匹配用户列表中的一个用户,如下所示:

export async function getLoginData(uid) {
  let loginData;

  const usersRef = await database.ref('users');
  const snap = await usersRef.once('value');

  snap.forEach((item) => {
    const itemVal = item.val();
    if (itemVal.uid === uid) {
      loginData = itemVal;
    }
  });

  return loginData;
}
就风格而言,我不喜欢这个。我更愿意对匹配进行筛选:

loginData = snap.filter((item) => item.val().uid === uid);

但筛选方法在快照中不可用。有没有一种方法可以从Firebase中编写更干净的单行数据检索?或者,它必须始终是一个前文和回调,正如我上面所说的那样?

< P>在担心当前过滤方法的风格之前,最好考虑它的性能。您正在下载
/users
节点下的所有数据,然后过滤掉
item.val().uid uid
中的任何内容。这样的客户端过滤会浪费用户的带宽

您应该尽可能使用Firebase的内置查询功能。在这种情况下,它似乎很简单:

let loginData;

const usersRef = await database.ref('users');
const snap = await usersRef.orderByChild('uid').equalTo(uid).once('value');

snap.forEach((item) => {
  const itemVal = item.val();
  loginData = itemVal;
});
在这种情况下,仍然需要循环。由于查询可能会匹配多个子节点,因此代码需要处理这种情况

如果您确信每个用户节点都有一个唯一的UID,您应该考虑以UID作为密钥(而不是另一个生成的密钥)存储用户数据:

将用户数据存储在密钥下可自动确保UID是唯一的,并使您无需查询即可查找用户数据。这也意味着您不再需要
forEach()

let loginData;

const usersRef = await database.ref('users');
const snap = await usersRef.child(uid).once('value');

const itemVal = snap.val();
loginData = itemVal;
这也使您更容易从函数返回正确的承诺:

export async function getLoginData(uid) {
  const snap = await database.ref('users').child(uid).once('value');

  return snap.val();
}

您是否阅读了有关排序和筛选数据的文档?谢谢,道格。是的,我应该好好读一下。正如你所说,我是Firebase的新手。:-)
export async function getLoginData(uid) {
  const snap = await database.ref('users').child(uid).once('value');

  return snap.val();
}