如何获取特定字段Firebase的数据?

问题描述 投票:0回答:1

我有这样的结构:

{ 
2018-02-27: {
-L6MTxsb_aJoKhMNA6X0 : {
comment: ...
created: ...
price : ...
}
-L6MTxsb_aJoKhCNA6X0 : {
comment: ...
created: ...
price : ...
employeeId: ...
}
}
2018-02-27: {
-L6MTxsb_aJoKhMNA6X0 : {
comment: ...
created: ...
price : ...
}
-L6MTxsb_aJoKhCNA6X0 : {
comment: ...
created: ...
price : ...
employeeId: ...
}
}

如何只获得具有employeeId键的对象

我需要将参数传递给函数并获取等于此参数的值我试过这个:

export const loadForEmployee = async employeeId => {

    let result = (await database('/balance/outcomes').orderByChild('employeeId').equalTo(employeeId ).once('value')).val() || {}


    return result
}

但它返回{}

javascript reactjs firebase
1个回答
0
投票

你试图深入搜索你的数据库,你的orderByChild方法中有一个拼写错误。

因为您的结构按日期和引用键细分 - 您需要搜索时间戳然后搜索子项。

{ 
  2018-02-27: {
    -L6MTxsb_aJoKhMNA6X0 : {
      comment: ...
      created: ...
      price : ...
    },
    -L6MTxsb_aJoKhCNA6X0 : {
      comment: ...
      created: ...
      price : ...
      employeeId: ...
    },
  },
  2018-02-27: {
    -L6MTxsb_aJoKhMNA6X0 : {
      comment: ...
      created: ...
      price : ...
    },
    -L6MTxsb_aJoKhCNA6X0 : {
      comment: ...
      created: ...
      price : ...
      employeeId: ...
    },
  },
};

您可以将时间戳传递给函数,如下所示;

export const loadForEmployee = async (employeeId, timestamp) => {
  const snapshots = await database('/balance/outcomes/' + timestamp)
    .orderByChild('employeeId')
    .equalTo(employeeId)
    .once('value');

  return snapshots.val() || {};
}

另一个选择是迭代所有结果,但这将是相当慢和密集的,具体取决于您的数据库有多大;

export const loadForEmployee = async employeeId => {
  const snapshots = await database('/balance/outcomes')
    .once('value');

  const results = {};

  snapshots.forEach(snapshot => {
    const timestamp = snapshot.key;

    const outcomes = snapshot.val();

    Object.keys(outcomes).forEach(key => {
      const outcome = outcomes[key];

      if (outcome.employeeId === employeeId) {
        if (!results[timestamp]) {
          results[timestamp] = {};
        }

        results[timestamp][key] = outcome;
      }
    });
  });

  return results;
}

我没有测试过这段代码,因此它可能不会逐字逐句,但总体思路应该是正确的。

© www.soinside.com 2019 - 2024. All rights reserved.