2016-06-20 3 views
0

Я хочу создать новый документ, если он не существует, и вернуть новый документ после его создания, однако если документ уже существует Я хотел бы, чтобы исключение было брошено.Как создать новый документ «если не существует» и вернуть новый документ с помощью встроенного драйвера MongoDB NodeJS

Я думаю, что способ, которым я занимаюсь этим, кажется хакерским, есть ли лучшее средство для этого?

var query = { name: 'guaranteed to be unique' } 
var new_doc = { ... } 
var col = // the Mongo collection we're using 

col.updateOne(
    query, 
    new_doc, 
    {upsert: true} 
) 
.then(update => col.findOne({_id, update.result.upserted.pop()._id})) 
.then(doc => console.log(doc)) 
.catch(exception => console.log('that already exists')) 
+1

Зависит, если вы хотите обновить его, если он существует? Если это так, вы можете просто использовать '{upsert: true}' on 'update'. В противном случае вы сделали это правильно. –

+0

Почему бы не создать уникальный индекс в 'name'? – robertklep

+0

@robertklep, не могли бы вы объяснить, как уникальный индекс разрешит это? – MatUtter

ответ

0

После долгого искания я нашел некоторые answers in this post, но вот чистый пример с findOneAndUpdate и returnOriginal набором свойств false

col.findOneAndUpdate(
    query, 
    new_doc, 
    { upsert: true, returnOriginal:false } 
) 
.then(update => update.value) 
.then(doc => console.log(doc)) 
+0

Помните, что любые свойства в 'new_doc' будут перезаписывать свойства в базе данных, если документ уже существует. – robertklep