0

假设我有这个数据数组:

const ids = [
  '7d8206d2-74bc-4b90-a237-37f92486cde4',
  'e594fe7f-d529-4a2f-ab24-ffc4e102268c',
  '7d8206d2-74bc-4b90-a237-37f92486cde4'
]

如您所见,有重复的 id,当我想像这样更新它时:

        await knex("products")
            .increment("purchasesCount")
            .whereIn("id", ids) 

在我的purchasesCount专栏中,我可以看到 values (1, 1),但这应该是(2, 1)因为重复的 ID。有没有办法解决它?

4

1 回答 1

0

最简单的解决方案是每次购买发出一个查询,如下所示:

for (const id of ids) {
  await knex("products").increment("purchasesCount").where({ id: id });
}

如果由于某种原因(例如性能)这是不可能的,那么您有两个选择:

  1. 进行内存分并计算您获得的每个 ID 的数量。然后,用.whereIn("id", idsWithThisCountOnly). 因此,在上面的示例中,您将执行 2 次更新,一次用于在数组中仅找到一次的所有 id,一次用于所有加倍的 id。您可能需要一个 Mapid => count来计算重复项,并且稍后需要将其反转为count => idsWithThisCountOnly[].
  2. 根本不要将计数存储在数据库中。检索数据时仅存储 ID、重复和使用GROUP BYwith 。COUNT这应该会提供更好的写入性能(INSERT 通常比 UPDATE 更快),但会增加存储大小并降低读取速度。

如果您已经有一个包含行项目的“交易”或“销售”表并且不经常访问汇总数据,则选项 2 可能更可取。

于 2021-11-10T15:35:40.363 回答