[英]Display One-to-Many result in a JSON with nodejs
你好,我有这个模型:网关 -serial -name -ip
设备 -uui -vendor -name -gw_serial
网关有 1 个或多个设备的地方
我需要使用 SQLITE3 在 nodejs 中的 rest/api 中显示这样的结果:
{
serial: 123,
name: Huawei,
ip: 192.168.12.1,
devices:[
{
uuid: 888,
vendor: Intel,
name: mouse,
},
{
uuid: 999,
vendor: Intel,
name: keyboard,
}
],
serial: 345,
name: Apple,
ip: 192.168.12.3,
devices:[
{
uuid: 567,
vendor: Intel,
name: mouse,
},
{
uuid: 893,
vendor: Intel,
name: keyboard,
}
]
}
我假设您正在使用node-sqlite3 。 我还没有用真实的数据库测试过它,但在这里我做了一些功能的模拟和演示。
也许这就是你需要的:
const get_grouped = async (db) => {
return new Promise((resolve, reject) => {
const sql = `
SELECT serial,
gateways.name AS gw_name,
uuid,
vendor,
devices.name
FROM gateways
JOIN devices
ON gateways.serial = gw_serial
`;
const acc = {};
db.each(sql, (error, gw_dev) => {
if(error) return reject(error);
acc[gw_dev.serial] = acc[gw_dev.serial] || {
serial: gw_dev.serial,
name: gw_dev.gw_name,
ip: gw_dev.ip,
devices: []
};
acc[gw_dev.serial].devices.push({
uuid: gw_dev.uuid,
vendor: gw_dev.vendor,
name: gw_dev.name,
});
}, (error, rows) => error ? reject(error) : resolve(Object.values(acc)));
});
};
基本上你将数据库实例传递给这个函数。
在每一行上,结果都存储在acc
变量中。 如果没有带有该串行的网关,则对其进行初始化。 然后设备只是被推送到它的集合。 当然,这假设每个网关的串行是唯一的,但它应该是。
如果没有错误,则调用oncomplete
回调时,结果将显示为acc
的值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.