我有这样的结构:
{
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
}
但它返回{}
你试图深入搜索你的数据库,你的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;
}
我没有测试过这段代码,因此它可能不会逐字逐句,但总体思路应该是正确的。