mongoose-find-or-create
Version:
A plugin for Mongoose which adds the findOrCreate method to models. The method will either append an existing object or save a new one, depending on wether it finds it or not.
64 lines (42 loc) • 2.13 kB
Markdown
A plugin for Mongoose which adds the findOrCreate method to models. The method will either append an existing object or save a new one, depending on wether it finds it or not.
There is already a [`mongoose-findorcreate` plugin](https://github.com/drudge/mongoose-findorcreate), but it has not been maintained, and the author does not respond to issues or PRs.
This is why this package is called `mongoose-find-or-create`
When you create a schema, simply add this plugin like so:
```js
const findOrCreate = require('mongoose-find-or-create')
const MySchema = new mongoose.Schema({
name: { type: String },
slug: { type: String }
})
MySchema.plugin(findOrCreate)
const MyModel = mongoose.model('Fruit', FruitSchema)
MyModel.findOrCreate({ name: 'Mike' }, (err, result) => {
// my new or existing model is loaded as result
})
// To search by one set of criteria and to save another set, simply use a second object:
MyModel.findOrCreate({ name: 'Mike' }, { slug: 'mike' }, (err, result) => {
// my new or existing model is loaded as result
})
```
You can pass an `options` object when adding the plugin to a schema or directly when using the method:
```js
// Like so...
MySchema.plugin(findOrCreate, { appendToArray: true, saveOptions: { validateBeforeSave: false } })
// And/or like so:
MyModel.findOrCreate({ name: 'Mike' }, { slug: 'mike' }, { appendToArray: true }, (err, result) => {
// my new or existing model is loaded as result
})
```
The possible options are:
* `appendToArray`: if a field in the existing doc is an array, we can overwrite it (`false`) or merely append to it (`true`)
* `saveOptions`: this object will be passed to the `save()` method as a set of options
* `saveIfFound`: default is `true` - if set to `false`, it will do creates where all data is saved, and will merely return the doc if it exists and not save the second parameter's fields.
## Testing
```
npm run test
```
## Contributing
PRs and issues are greatly appreciated, so please go ahead!