Я пишу Rest API с использованием JS-экспресс-узла с базой данных Firebase.В Firebase у меня есть две коллекции, например:
Bin (binName, binLocaton, hardwareId)
BinsInformation (date, payloadFields { hardwareId, levle })
Как я могу объединить эти две коллекции на основе поля hardwareId
?
I would like to join to collections like two tables in MySQL.
Ex. "SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id "
Like the above MySQL query i would like join my two collections "Bin" and "BinInformation".
Если я присоединюсь к одному документу с определенным идентификаторомэто дает правильный вывод.но когда я пытаюсь объединить все документы в двух коллекциях с отдельным запросом, это дает «асинхронную ошибку».
вот мои коллекции:
Бины:
[
{
AreaID: "ZYwQHIrZPEDd359e6WRf"
Capacity: "123"
Latitude: "17.658745"
LocationName: "testing"
Longitude: "78.9874545"
hardwareid: "4321"
},
{
AreaID: "ZYwQHIrZPEDd359e6WRf"
Capacity: "123"
Latitude: "17.658745"
LocationName: "testing"
Longitude: "78.9874545"
hardwareid: "5432"
}
]
Информация о бинах:
[
{
date: September 24, 2018 at 12:00:00 AM UTC+5:30,
payload_fields: {
hardwareid: "4321"
level : 60
}
},
{
date: September 24, 2018 at 12:00:00 AM UTC+5:30,
payload_fields: {
hardwareid: "5432"
level : 23
}
}
]
Здесь мне нужно получить все бины с соответствующей информацией о бинах.мой код выглядит следующим образом
app.get('/twoColectionJoin', asyncHandler( async (req, res, next) => {
console.log('await');
try {
let allDocs = [];
const snapshot = await db.collection('Bins').get();
let i = 0;
snapshot.forEach( async (doc) => {
let dummyDoc = doc.data();
const details = await getBinDet(dummyDoc.hardwareid);
dummyDoc.id = doc.id;
dummyDoc.det = details;
allDocs.push(dummyDoc);
i++;
console.log(allDocs);
});
res.status(200).send(allDocs);
}
catch(e){
next(e);
}
}) );
async function getBinDet(hardwareid){
let dummyDoc = {};
return new Promise(function(resolve, reject){
try{
setTimeout(function(){
db.collection('BinsInformation')
.where('payload_fields.hardwareid', '==', hardwareid)
.limit(1).get()
.then(snap => {
snap.forEach(element => {
//return element.data();
dummyDoc = element.data();
});
resolve(dummyDoc);
})
.catch(err2 => {
reject(err2);
});
}, 300);
}catch(err){
console.log(err);
}
});
}
Ожидаемый вывод:
[
{
AreaID: "ZYwQHIrZPEDd359e6WRf"
Capacity: "123"
Latitude: "17.658745"
LocationName: "testing"
Longitude: "78.9874545"
hardwareid: "4321",
det: {
date: September 24, 2018 at 12:00:00 AM UTC+5:30,
payload_fields : {
hardwareid: "4321"
level : 60
}
}
},
{
AreaID: "ZYwQHIrZPEDd359e6WRf"
Capacity: "123"
Latitude: "17.658745"
LocationName: "testing"
Longitude: "78.9874545"
hardwareid: "5432",
det: {
date: September 24, 2018 at 12:00:00 AM UTC+5:30,
payload_fields: {
hardwareid: "5432"
level : 23
}
}
}
]
Но в результате получается: []