node.js - 使一列依赖于关联 Sequelize

标签 node.js express sequelize.js

我有一张名为 HOUSE 的表。它有一个名为 STATUS 的列。
我还有一个名为 TASK 的表,它还有一个名为 STATUS 的列。
每个房子都有很多任务。如果有一项任务的状态为 inProgress ,则房屋状态应为 inProgress 。如果所有任务都是 done ,那么 house 就是 done
我希望房子的这个状态栏依赖于它所有任务的状态。
当我调用 /getHouses 时,这是我将名为 status 的属性添加到每个房屋对象的操作,因为目前我在 HOUSE 表中没有 STATUS 列。

exports.getMyHouses = (req, res) => {
  const page = myUtil.parser.tryParseInt(req.query.page, 0)
  const limit = myUtil.parser.tryParseInt(req.query.limit, 10)

  db.House.findAndCountAll({
    where: { userId: req.user.id },
    include: [
      {
        model: db.Task,
        as: "task",
        include: [
          {
            model: db.Photo,
            as: "photos"
          }
        ]
      },
      {
        model: db.Address,
        as: "address"
      }
    ],
    offset: limit * page,
    limit: limit,
    order: [["id", "ASC"]],
  })
    .then(data => {
      let newData = JSON.parse(JSON.stringify(data))
      const houses = newData.rows

      for (let house of houses) {
        house.status = "done"

        const tasks = house.task
        for (let task of tasks) {
          if (task.status == "inProgress") {
            house.status = "inProgress"
            break
          }
        }
      }

      res.json(myUtil.response.paging(newData, page, limit))
    })
    .catch(err => {
      console.log("Error get houses: " + err.message)
      res.status(500).send({
        message: "An error has occured while retrieving data."
      })
    })
}

编辑:我刚刚意识到也许我可以在每次任务状态更新时更新房子的状态列。我以前从未想过这个问题。
但如果有人能确认这是一个好的策略或者是否有更好的策略,我仍然会喜欢它。

最佳答案

只要您不需要按房屋的状态进行过滤,您所拥有的选项就是可行的。这基本上称为虚拟字段(因为它不是直接来自数据库的东西)。如果确实需要按此字段进行过滤,则需要查询所有 InProgress 任务并获取唯一的房屋 ID。
您也可以在任务更新时更新房子的状态列,但如果例如,多个请求将任务更新到同一房子,您可能会遇到一些竞争条件。如果您也是,请确保在此处运行事务。使用 InProgress 任务查询/过滤房屋会更快,因为您可以直接查询它。但是,更新会更慢,因为您需要运行任务更新、任务计数查询和房屋更新查询。
两者都有其优点和缺点,这主要取决于您的应用程序设计要求。

关于node.js - 使一列依赖于关联 Sequelize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62857051/

相关文章:

javascript - 使用 Promise 将 mongoose 函数单独保留在 Nodejs 应用程序中

session - Mongoose-Auth/Express/Connect 不保留 session 问题

jquery - Express 不路由某些 jQuery 请求

javascript - Sequelize/postgres : Get records matching a value inside an array of object with a provided value

node.js - Sequelize createdAt 无法修改

json - 使用管道 Node 请求防止立交桥 api 上的 504 网关超时

python - 如何使用OCR提取指定位置的文本信息?

node.js - 从 nodejs 压缩和下载

mysql - 如何与 Sequelize 建立多对多关联?

javascript - Express Session 不同的到期时间