我遇到一些麻烦,将我的一些数据用于crossfilter。 让我们首先解释一下我想做什么;
我有两个不同的数据库表:
传感器表正在保存每个传感器的信息。 影响表中包含每个传感器影响的信息。
现在我想创建交互式图形,我可以在其中筛选所有数据。因此,例如在选择location_id = 1时。我希望看到所有图表都更改其数据以显示与位置1相关的所有数据。 (所以在这种情况下,我希望看到与位置1相关的影响和传感器)
首先,我在我的数据服务中编写了一个函数getSensorDataWithImpacts()。这样我就可以得到一个包含传感器的阵列,这些传感器都会受到影响。
对象[0]如下所示:
[
EUI: 123,
location_id: 1,
latitude: 1.285101,
longitude: 103.769902,
impacts: {
Count: 2,
Items: [
0:
EUI: {S: "123"},
timestamp: {N: "1512028997"}
accelX: {N: -10}
accelY: {N: 20}
accelZ: {N: -30}
gyroX: {N: -40}
gyroY: {N: 50}
gyroZ: {N: 60}
impactScore: {N: 2000},
1:
EUI: {S: "123"},
timestamp: {N: "1512028900"}
accelX: {N: -23}
accelY: {N: 56}
accelZ: {N: -12}
gyroX: {N: -43}
gyroY: {N: 6}
gyroZ: {N: 12}
impactScore: {N: 3000},
],
ScannedCount: 2,
}
收到此对象后,我创建了一个crossfilter。 在此之后,我可以通过执行以下操作创建多个维度:
let locationDim = ndx.dimension(function (d) {
return d.location_id;
});
let locationGroup = locationDim.group();
我为EUI做了同样的事情:
let sensorsDim = ndx.dimension(function (d) {
return d.EUI;
});
let sensorsGroup = sensorsDim.group();
对于影响:
let impactDim = ndx.dimension(function (d) {
for(let a = 0; a<d.impacts.Items.length; a++){
return d3.time.minute(new Date(d.impacts.Items[a].timestamp['N'] * 1000));
}
});
let impactGroup = impactDim.group()
.reduceSum(function (d) {
for(let a = 0; a<d.impacts.Count; a++){
return d.impacts.Items[a].impactScore['N'] / 1000;
}
});
通过这些尺寸,我可以成功过滤所有数据。我看到不同的位置,不同的EUI号码,我看到每个传感器的1个影响。这不是预期的。我希望收到每个传感器的所有影响。
Different graphs with 1 impact for each sensor
我不知道我做错了什么 真的很感激任何帮助!