如何查询具有不同属性的模型

Posted

技术标签:

【中文标题】如何查询具有不同属性的模型【英文标题】:How to query a model with different attributes 【发布时间】:2018-04-12 08:51:40 【问题描述】:

我正在 Express 中构建一个应用程序,并为我的数据库使用 Postgres,为 ORM 使用 Sequelize。

在我的数据库中,每个 Post 都可以有以下 5 种类型之一:12345

我想按类型显示所有帖子的数量。

router.route('/post).get(async (req, res) => 
  const postOne = await Post.findAll(
    where:  
      state: 1
    
  );
  const postTwo = await Post.findAll(
    where:  
      state: 2
    
);
res.send( postOne: postOne.length, postTwo: postTwo.length );

我可以为所有 5 种类型编写这样的代码,但我想知道是否有更短的方法可以做到这一点,这样我就不必编写 5 次相同的代码。

谢谢!

【问题讨论】:

你使用哪个框架?你用什么数据库? 我正在使用 Node 和 Postgres 你确定你不使用 ExpressJs 或类似的东西吗?我相信 NodeJS does not have ORM 包括在内。大多数 ORM 都提供聚合功能,可帮助您在一次查询中获取所有计数。 谢谢@skyboyer 我澄清了我的问题 现在经过澄清,似乎下一个链接正是您所需要的:***.com/questions/22627258/… 【参考方案1】:
const getPostWithType = (type) => Post.findAll(
  where:  
    state: type
  
);

现在您可以改为await getPostWithType(1)。甚至更好:

const postTypes = [1,2,3,4,5];
const allPosts = await Promise.all(postTypes.map(getPostWithType));

// allPosts is now an array with the results. You can map it again to get the lengths
const allPostLengths = allPosts.map(p => p.length);

【讨论】:

【参考方案2】:

使用数组怎么样?如下图...

let promiseArray = [];

for (let i = 1; i <= 5; i++) 
  let promise = Post.findAll(
    where:  
      state: i
    
  );

  promiseArray.push(promise);


Promise.all(promiseArray).then(function(response) 
  //Do whatever...
);

【讨论】:

以上是关于如何查询具有不同属性的模型的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 jpa 规范添加不同的属性以进行查询

linq查询具有不同属性的多个表

组合两个查询集,具有不同值的公共字段

如果它们都具有相同的 id,如何将来自 sql 查询的图像存储在不同的变量下?

具有不同角色的 Rails Person 模型作为子类

Sails.js - 如何对具有数组类型属性的模型进行本机查询?