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

时间:2018-09-19 08:00:02

标签: javascript reactjs firebase

我有这样的结构:

{ 
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
}

但是它返回{}

1 个答案:

答案 0 :(得分: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;
}

我尚未测试此代码,因此它可能无法逐字记录,但总体思路应该是正确的。