Sequelize ORMを使用してPSQL DBからデータを取得しています。ただし、何かを取得すると、大量のデータが提供されます。必要なデータは「dataValues」内のみです。もちろん、object.dataValuesを使用できます。しかし、他の良い解決策はありますか?
私はSequelize 4.10を使用しています
この問題は、次を使用してログに記録する場合にのみ発生します。
console.log(Model.findAll());
変数に保存すると、「dataValues」を使用せずに内部のオブジェクトに直接アクセスできます
はい、できます
Model.findAll({
raw: true,
//Other parameters
});
モデルインスタンスではなく、データのみを返します
Sequelizeは、メタデータを含む仮想オブジェクトに戻り値をすべてラップします。オブジェクトがあり、装飾されていないデータ値だけが必要な場合は、次のように展開できます。
Model.findById(1).then(data => {
console.log(data.get({ plain: true }));
});
さらに、オブジェクトを印刷するだけの場合は、.toJSON
方法。
Model.findById(1).then(data => {
console.log(data.toJSON());
});
最後に、たくさん検索して答えを見つけました。あなたはこのようなことをすべきです
const users = await db.users.findAll({})
.map(el => el.get({ plain: true })) // add this line to code
ソース: github issue
ネストされたエンティティの場合、この愚かな回避策は私にとってはうまくいきます:
_let row = await Model.findOne({
include: [ /*your includes here*/ ]
});
row = JSON.parse( JSON.stringify(row, null, 4) );
_
どういうわけかJSON.stringify(row, null, 4)
は余分なものをすべて削除し、オブジェクトのdataValues
プロパティがオブジェクトそのものであるように見せかけます。次に、JSON.parse(...)
はオブジェクトを元に戻します。
編集:
どうやら私はTypeScriptが初めてなので、これはまったく必要ありませんでした。 console.log(row)
の巨大なオブジェクトの印刷は混乱しました。私は良いol 'c#回が恋しい:'(
Masoud Tavakkoliの答えを明確にするために(そのgithubの答えではすぐにはわかりません):element.get({ plain: true })
を使用すると、各属性のキーと値のペアでobjectsの配列が返されます。
オブジェクトの代わりに特定の属性値(ユーザーIDなど)の配列だけが必要な場合は、次のようなものを使用できます。
const users = await User.findAll({
attributes: ["id"],
where: {} // Your filters here
}).map(u => u.get("id")) // [1,2,3]
Nika Kasradzeの答えは、実際には中間段階と同じ結果を達成します。 JSON stringifierを使用すると、同じ配列出力が生成されます。これはマッピングよりも速い可能性がありますが、わかりません。
const users = await User.findAll({
attributes: ["id"],
where: {} // Your filters here
})
const userIds = JSON.stringify(users)) // [1,2,3]