Laz*_*ing 5 json flatten sequelize.js
我正在将我所有的查询转换为 sequelize。The problem I have come across is that when select queries include associations (ex. one to many), the object I get is an array of nested objects.
它看起来像:
[
{
"field1": "someval",
"field2": "someval1",
"assoc_table": {
"field_a": 1,
"field_b": "someval"
}
},
{
"field1": "someval",
"field2": "someval3",
"assoc_table": {
"field_a": 5,
"field_b": "someval"
}
},
{
"field1": "someval",
"field2": "someval3",
"assoc_table": {
"field_a": 12,
"field_b": "someval"
}
}
]
Run Code Online (Sandbox Code Playgroud)
我尝试使用不同的模块来展平对象(在循环内,每个对象单独),但我总是收到一个错误,告诉我我试图展平的不仅仅是对象。
此外,我更愿意避免对象被展平的部分,并通过 sequelize 简单地获得平坦的结果。
续集代码如下所示:
models.table1.findAll({
attributes: ['field1', 'field2'],
where: {field1: someval},
include: [{model: models.assoc_table, required: true, attributes:['field_a', 'field_b']}]
}).then(function (result) {
res.send(result);
}).catch(function(error) {
console.log(error);
});
Run Code Online (Sandbox Code Playgroud)
老问题,但当我也尝试这样做并找到一个不需要“之后”映射的纯续集解决方案时,我想在此处添加它。因此,要让sequelize本身返回所需的对象格式,将是这样的,其中attributes根据表中的列返回值显式分配include:
models.table1.findAll({
attributes: [
'field1',
'field2',
[sequelize.col('models.assoc_table.field_a'), 'field_a'], // Set key
[sequelize.col('models.assoc_table.field_b'), 'field_b'], // Set key
],
where: {field1: someval},
include: [
{model: models.assoc_table,
required: true,
attributes:[], // Explicitly do not send back nested key's
}
]
})
Run Code Online (Sandbox Code Playgroud)
您的问题的一部分可能是您result的模型实例数组,因此如果您没有调用toJSON数组中的元素,您可能会遇到展平它的问题。我提供了可以使您的示例变平的代码:
result.forEach(obj => {
Object.keys(obj.toJSON()).forEach(k => {
if (typeof obj[k] === 'object') {
Object.keys(obj[k]).forEach(j => obj[j] = obj[k][j]);
}
});
});
Run Code Online (Sandbox Code Playgroud)
您还可以将raw: true选项添加到findAll,这将使您的对象变平,但它看起来像这样:
[
{
"field1": "someval",
"field2": "someval1",
"assoc_table.field_a": 1,
"assoc_table.field_b": "someval"
},
...
]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7216 次 |
| 最近记录: |