如何使用基于_id的Mongoose进行upsert?

时间:2011-12-13 14:05:55

标签: mongodb node.js coffeescript mongoose upsert

当我这样做时:

client_id = req.param("client_id") ? null
client =
  name: req.param "clientName"
  status: 'active'

Client.update {_id: client_id}, client, {upsert: true}, (err, updRes) ->
  if err
    res.json
      error: "Couldn't create client"
  else
    res.json client

除了null _id字段外,它将创建一个新的客户记录。我假设这是因为upsert的插入部分向query查找以创建文档。我怎么能这样做,如果没有找到文档,那么插入一个新的ObjectId

2 个答案:

答案 0 :(得分:8)

不确定你是否已经想出这个,但如果你不想遇到像上面提到的Mustafa这样的独特键约束的麻烦,我做的方法是使用mongoose的{{3} }:

// require mongoose

client_id = req.param("client_id") ? new mongoose.Types.ObjectId
client =
  name: req.param "clientName"
  status: 'active'

Client.findByIdAndUpdate client_id, client, {upsert: true}, (err, updRes) ->
  if err
    res.json
      error: "Couldn't create client"
  else
    res.json client

我从来没有写过CoffeeScript,所以请原谅我,如果有些语法错了,但我认为我应该做的很明显。

需要注意的一点是,您需要确保client_id既不是空字符串(因为这会导致'无效的ObjectID'错误)也不是null(因为mongoose似乎从您正在查询的那个中推断出新文档的id对于)。如果是,我创建一个新的ObjectId,这会导致查询错过,因此我创建了一个带有该ID的新文档,因为我传递了{upsert:true}。

这似乎解决了我的问题。

答案 1 :(得分:2)

与Mongoose有关的一切就是在客户端调用save,如果它是更新或插入,Mongoose会自行解决:

client_id = req.param("client_id") ? null
client_data =
  name: req.param "clientName"
  status: 'active'
  _id: client_id

client = new Client(client_data)
client.save (err) ->
  if err
    res.json
      error: "Couldn't save client"
  else
    res.json client

注意:客户端是Mongoose模型。