web-dev-qa-db-ja.com

Sequelize ORMからdataValuesのみを取得します

Sequelize ORMを使用してPSQL DBからデータを取得しています。ただし、何かを取得すると、大量のデータが提供されます。必要なデータは「dataValues」内のみです。もちろん、object.dataValuesを使用できます。しかし、他の良い解決策はありますか?

私はSequelize 4.10を使用しています

16
Gijo Varghese

この問題は、次を使用してログに記録する場合にのみ発生します。

console.log(Model.findAll());

変数に保存すると、「dataValues」を使用せずに内部のオブジェクトに直接アクセスできます

3
Gijo Varghese

はい、できます

Model.findAll({
 raw: true,
 //Other parameters
});

モデルインスタンスではなく、データのみを返します

31
Shivam

Sequelizeは、メタデータを含む仮想オブジェクトに戻り値をすべてラップします。オブジェクトがあり、装飾されていないデータ値だけが必要な場合は、次のように展開できます。

Model.findById(1).then(data => {
  console.log(data.get({ plain: true }));
});

さらに、オブジェクトを印刷するだけの場合は、.toJSON 方法。

Model.findById(1).then(data => {
  console.log(data.toJSON());
});
13
C Deuter

最後に、たくさん検索して答えを見つけました。あなたはこのようなことをすべきです

const users = await db.users.findAll({})
   .map(el => el.get({ plain: true })) // add this line to code

ソース: github issue

5

ネストされたエンティティの場合、この愚かな回避策は私にとってはうまくいきます:

_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#回が恋しい:'(

1
Nika Kasradze

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]
0
defraggled