Как я могу отказаться от использования Mongoose на основе _id? - PullRequest
3 голосов
/ 13 декабря 2011

Когда я делаю это:

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 ]

8 голосов
/ 24 октября 2012

Не уверен, что вы уже поняли это, но в случае, если вы не хотите столкнуться с проблемами с уникальными ключевыми ограничениями, такими как Mustafa, упомянутый выше, я сделал это с помощью findByIdAndUpdate mongoose:

// 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 не является ни пустой строкой (поскольку это приведет к ошибке 'Invalid ObjectID'), ни нулевой (поскольку mongoose, по-видимому, выводит идентификатор нового документа из того, который выЗапрашиваем)В этом случае я создаю новый ObjectId, который приведет к тому, что запрос будет пропущен, и, следовательно, создаю новый документ с этим идентификатором, поскольку я передаю {upsert: true}.

Это, похоже, решило проблему дляя.

2 голосов
/ 13 декабря 2011

Все, что вам нужно сделать с 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.

...