VioPaige
VioPaige

Reputation: 45

Mongoose findOneAndUpdate() only updates if document already exists, doesn't create new doc if not?

I ran into a problem with my javascript bot, my custom prefixes don't get saved if there isn't yet a custom prefix for that server, if there is though, it does get updated correctly.

await mongo().then(async (mongoose) => {
                try {
                    let newprefix = content.replace(`${prefix}setprefix `, '')
                    await prefixSchema.findOneAndUpdate({_id: guild.id}, {_id: guild.id, prefix: newprefix})
                        .then(async () => {
                            console.log(`updated prefix for guild: ${guild.id}`)
                            await channel.send(`Succesfully updated prefix for this server to '${newprefix}'`)
                            message.guild.me.setNickname(`[${newprefix}] - Helix`)
                        })
                        .catch(async (err) => {
                            console.error(`failed to update prefix for guild: ${guild.id}\n${err}`)
                            await channel.send(`Failed to update prefix.`)
                        })
                    console.log("saved to db")

                } catch {
                    console.log("Something went wrong while saving new prefix for a server.")
                } finally {
                    mongoose.connection.close()
                }

The bot does print and send that it succesfully updated the prefix, but if there isn't already a document for the guild.id, nothing is saved. What did I do wrong and how can I solve it?

Thanks for reading!

Upvotes: 0

Views: 1078

Answers (1)

Urvesh Nimavat
Urvesh Nimavat

Reputation: 326

Model.updateOne()

Parameters

[options.upsert=false] «Boolean» if true, and no documents found, insert a new document

MongoDB will update only the first document that matches filter regardless of the value of the multi option. Use replaceOne() if you want to overwrite an entire document rather than using atomic operators like $set. Example:

const res = await Person.updateOne({ name: 'Jean-Luc Picard' }, { ship: 'USS Enterprise' });
res.n; // Number of documents matched
res.nModified; // Number of documents modified

please visit https://mongoosejs.com/docs/api.html#model_Model.updateOne for more information.

Upvotes: 1

Related Questions