【问题标题】:How did mongoose decide to 'insert' or 'update' an document when call document.save()?mongoose 在调用 document.save() 时是如何决定“插入”或“更新”文档的?
【发布时间】:2017-12-30 05:44:20
【问题描述】:

我从 MongoDB 迁移到 Postgres。但我还是更喜欢猫鼬提供的一些接口。因此,我尝试实现它们。这是问题所在,我创建了一个名为“用户”的类。它有“保存”方法。在猫鼬中,无论何时更新或创建新文档,我都可以调用“保存”将文档插入/更新到数据库中。他们是如何实施的?有什么建议吗?

这是我尝试过的,但我不确定这是不是一个好习惯:

class User {
  constructor (obj) {
    for (let key in obj) {
      this[key] = obj[key]
    }

    Object.defineProperty(newAdmin, 'exist', {
      configurable: true,
      writable: true,
      enumerable: false,
      value: false
    })
  }

  async update () {//}

  async save () {
    const user = this
    if (user.exist) {
      return user.update()
    }
    const query = `query here`
    const {rows} = await db.query(query)
    Object.assign(user, rows[0])
    user.exist = true
    return user
  }
}

【问题讨论】:

标签: node.js mongodb postgresql mongoose


【解决方案1】:

MongoDB 在更新文档时支持 upsert 的概念。 mongoose 如何从您的模型更新数据库取决于您使用的确切方法。但是,它可能正在使用该功能。

这现在出现在 postgres 9.5+ 中,请参阅 UPSERT 文档。

简而言之,您可以运行INSERT 语句并使用ON CONFLICT UPDATE,在发生约束错误时强制它更新列(例如,主键已经存在行)。

例如,您可以执行以下操作:

INSERT INTO users (ID,Name) VALUES(1,'john')
ON CONFLICT ON CONSTRAINT users_pkey DO
UPDATE SET Name=EXCLUDED.Name

【讨论】:

    猜你喜欢
    • 2019-07-09
    • 2015-10-20
    • 2018-01-02
    • 2020-09-14
    • 2017-11-27
    • 2018-01-13
    • 2018-09-04
    相关资源
    最近更新 更多