从关联的续集中返回平面对象

时间:2017-01-06 09:33:20

标签: json sequelize.js flatten

我正致力于在sequelize中转换我的所有查询。 我遇到的问题是,当select查询包含关联(例如一对多)时,我得到的对象是一组嵌套对象。

它看起来像:

[   
  {
    "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"
    }   
   } 
]

我尝试使用不同的模块来展平对象(在循环内部,每个对象单独),但我总是得到一个错误,告诉我试图压扁的不仅仅是对象。

此外,我宁愿避开物体被压平的部分,也只是用续集来得到平坦的结果。

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);
});

2 个答案:

答案 0 :(得分:1)

您的部分问题可能是您的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]);
        }
    });
});

您还可以将raw: true添加为findAll选项,这会使您的对象变平,但它将如下所示:

[   
  {
    "field1": "someval",
    "field2": "someval1",
    "assoc_table.field_a": 1,
    "assoc_table.field_b": "someval"
  },
  ...
]

答案 1 :(得分:0)

一个老问题,但是当我也尝试这样做时,发现了一个不需要“之后”映射的纯序列化解决方案,我想在这里添加它。因此,要使序列本身返回所需的对象格式,就是这样,其中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
     }
   ]
})