我有这样的结构:
{
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
}
但是它返回{}
答案 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;
}
我尚未测试此代码,因此它可能无法逐字记录,但总体思路应该是正确的。