mongoose是如何决定插入'或者'更新'调用document.save()时的文档?

时间:2017-07-24 15:02:58

标签: node.js mongodb postgresql mongoose

我从MongoDB迁移到Postgres。但我还是喜欢猫鼬提供的一些界面。因此我尝试实施它们。这是问题所在,我创建了一个名为' User'的课程。它已经节省了#39;方法。在猫鼬中,无论何时更新或创建新文档,我都可以打电话来保存'将文档插入/更新到数据库中。他们是如何实现的?有什么建议吗?

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

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
  }
}

1 个答案:

答案 0 :(得分: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