moongoon
Version, currently 0.2.023 versions
- 0.7.4latestMay 4, 2021
- 0.7.3not indexedOct 11, 2024
- 0.7.2not indexedOct 11, 2024
- 0.7.1not indexedOct 11, 2024
- 0.7.0not indexedOct 11, 2024
- 0.6.0not indexedOct 11, 2024
- 0.5.1not indexedOct 11, 2024
- 0.5.0not indexedOct 11, 2024
- 0.4.1not indexedOct 11, 2024
- 0.4.0not indexedOct 11, 2024
- 0.3.1not indexedOct 11, 2024
- 0.3.0not indexedOct 11, 2024
- 0.2.9not indexedOct 11, 2024
- 0.2.8not indexedOct 11, 2024
- 0.2.7not indexedOct 11, 2024
- 0.2.6not indexedOct 11, 2024
- 0.2.5not indexedOct 11, 2024
- 0.2.4not indexedOct 11, 2024
- 0.2.3not indexedOct 11, 2024
- 0.2.2not indexedOct 11, 2024
- 0.2.1not indexedOct 11, 2024
- 0.2.0not indexedOct 11, 2024
- 0.1.0not indexedOct 11, 2024
github.com/elbywan/moongoon
An object-document mapper (ODM) for MongoDB.
47 stars
0 dependents
License: MIT
Nothing has been indexed for 0.2.0 yet. The tag is recorded, its shard.yml has not been read, so the manifest and dependency list below are empty because they are unknown rather than because they are absent.
Installation
# Add this to your shard.yml
dependencies:
moongoon:
github: elbywan/moongoon
version: ~> 0.2.0Then run:
shards installshard.yml
No shard.yml has been indexed for 0.2.0. You can read it on the repository.
Dependencies
Unknown: the shard.yml for this version has not been read yet.
README
This README is the one indexed from the repository at its latest ref, not from the tag for this version.
<div align="center">
<img src="icon.svg" width="128" height="128" />
<h1>moongoon</h1>
<h3>A MongoDB ODM written in Crystal.</h3>
<a href="https://travis-ci.org/elbywan/moongoon"><img alt="travis-badge" src="https://travis-ci.org/elbywan/moongoon.svg?branch=master"></a>
<a href="https://github.com/elbywan/moongoon/tags"><img alt="GitHub tag (latest SemVer)" src="https://img.shields.io/github/v/tag/elbywan/moongoon"></a>
<a href="https://github.com/elbywan/moongoon/blob/master/LICENSE"><img alt="GitHub" src="https://img.shields.io/github/license/elbywan/moongoon"></a>
</div>
<hr/>
#### An object-document mapper (ODM) library written in Crystal which makes interacting with MongoDB a breeze.
This library relies on:
- [`cryomongo`](https://github.com/elbywan/cryomongo) as the underlying MongoDB driver.
- [`bson.cr`](https://github.com/elbywan/bson.cr) as the BSON implementation.
*For the moongoon version relying on the [`mongo.cr`](https://github.com/elbywan/mongo.cr) driver, please check the [mongo.cr](https://github.com/elbywan/moongoon/tree/mongo.cr) branch.*
## Installation
1. Add the dependency to your `shard.yml`:
```yaml
dependencies:
moongoon:
github: elbywan/moongoon
```
2. Run `shards install`
3. Profit! đź’°
## Usage
### Minimal working example
```crystal
require "moongoon"
# A Model inherits from `Moongoon::Collection`
class User < Moongoon::Collection
collection "users"
index keys: { name: 1, age: 1 }, options: { unique: true }
property name : String
property age : Int32
property pets : Array(Pet)
# Nested models inherit from `Moongoon::Document`
class Pet < Moongoon::Document
property pet_name : String
end
end
# Connect to the mongodb instance.
Moongoon.connect("mongodb://localhost:27017", database_name: "my_database")
# Initialize a model from arguments…
user = User.new(name: "Eric", age: 10, pets: [
User::Pet.new(pet_name: "Mr. Kitty"),
User::Pet.new(pet_name: "Fluffy")
])
# …or JSON data…
user = User.from_json(%(
"name": "Eric",
"age": 10,
"pets": [
{ "pet_name": "Mr. Kitty" },
{ "pet_name": "Fluffy" }
]
))
# …or from querying the database.
user = User.find_one!({ name: "Eric" })
# Insert a model in the database.
user.insert
# Modify it.
user.name = "Kyle"
user.update
# Delete it.
user.remove
```
### Connecting
[**API documentation**](https://elbywan.github.io/moongoon/Moongoon/Database.html)
- [Initial connection](https://elbywan.github.io/moongoon/Moongoon/Database.html#connect(database_url:String="mongodb://localhost:27017",database_name:String="database",*,reconnection_delay=5.seconds)-instance-method)
- [Hooks](https://elbywan.github.io/moongoon/Moongoon/Database.html#after_connect(&block:Proc(Nil))-instance-method)
- [Low-level](https://elbywan.github.io/moongoon/Moongoon.html#client:Mongo::Client-class-method)
```crystal
require "moongoon"
Moongoon.before_connect {
puts "Connecting…"
}
Moongoon.after_connect {
puts "Connected!"
}
# … #
Moongoon.connect(
database_url: "mongodb://address:27017",
database_name: "my_database"
)
# In case you need to perform a low level query, use `Moongoon.client` or `Moongoon.database`.
# Here, *db* is a `cryomongo` Mongo::Database. (For more details, check the `cryomongo` documentation)
db = Moongoon.database
cursor = db["my_collection"].list_indexes
puts cursor.to_a.to_json
```
### Models
[**API documentation**](https://elbywan.github.io/moongoon/Moongoon/Collection.html)
- [Indexes](https://elbywan.github.io/moongoon/Moongoon/Collection.html#index(collection:String?=nil,database:String?=nil,options=NamedTuple.new,name:String?=nil,**keys):Nil-class-method)
- [Relationships](https://elbywan.github.io/moongoon/Moongoon/Collection.html#reference(field,*,model,many=false,delete_cascade=false,clear_reference=false,back_reference=nil)-macro)
- [Aggregations](https://elbywan.github.io/moongoon/Moongoon/Collection.html#aggregation_pipeline(*args)-class-method)
- [Versioning](https://elbywan.github.io/moongoon/Moongoon/Collection/Versioning.html#versioning(ref_field=nil,auto=false,&transform)-macro)
```crystal
require "moongoon"
class MyModel < Moongoon::Collection
collection "models"
# Note: the database can be changed - if different from the default one
# database "database_name"
# Define indexes
index keys: { name: 1 }
# Specify agregation pipeline stages that will automatically be used for queries.
aggregation_pipeline(
{
"$addFields": {
count: {
"$size": "$array"
}
}
},
{
"$project": {
array: 0
}
}
)
# Collection fields
property name : String
property count : Int32?
property array : Array(Int32)? = [1, 2, 3]
end
# …assuming moongoon is connected… #
MyModel.clear
model = MyModel.new(
name: "hello"
).insert
model_id = model.id!
puts MyModel.find_by_id(model_id).to_json
# => "{\"_id\":\"5ea052ce85ed2a2e1d0c87a2\",\"name\":\"hello\",\"count\":3}"
model.name = "good night"
model.update
puts MyModel.find_by_id(model_id).to_json
# => "{\"_id\":\"5ea052ce85ed2a2e1d0c87a2\",\"name\":\"good night\",\"count\":3}"
model.remove
puts MyModel.count
# => 0
```
### Running scripts
[**API documentation**](https://elbywan.github.io/moongoon/Moongoon/Database/Scripts/Base.html)
```crystal
# A script must inherit from `Moongoon::Database::Scripts::Base`
# Requiring the script before connecting to the database should be all it takes to register it.
#
# Scripts are then processed automatically.
class Moongoon::Database::Scripts::Test < Moongoon::Database::Scripts::Base
# Scripts run in ascending order.
# Default order if not specified is 1.
order Time.utc(2020, 3, 11).to_unix
def process(db : Mongo::Database)
# Dummy code that will add a ban flag for users that are called 'John'.
# This code uses the `cryomongo` syntax, but Models could
# be used for convenience despite a small performance overhead.
db["users"].update_many(
filter: {name: "John"},
update: {"$set": {"banned": true}}
)
end
end
```
## Contributing
1. Fork it (<https://github.com/elbywan/moongoon/fork>)
2. Create your feature branch (`git checkout -b my-new-feature`)
3. Commit your changes (`git commit -am 'Add some feature'`)
4. Push to the branch (`git push origin my-new-feature`)
5. Create a new Pull Request
## Contributors
See the [contributors page](https://github.com/elbywan/moongoon/graphs/contributors).
## Credit
- Icon made by [Smashicons](https://www.flaticon.com/authors/smashicons) from [www.flaticon.com](https://www.flaticon.com).Documentation
Built from the current release. The first visit to a release nobody has asked for starts its build.
Links
This release
- Version
0.2.0- Tagged
- Oct 11, 2024
- Commit
31bec04863e8- Indexed
- not yet
Dependents
No indexed shard depends on this one yet.
Repository
github.com/elbywan/moongoon
Metadata
- Created
- Aug 12, 2026
- Updated
- Aug 12, 2026
- Synced
- Aug 12, 2026
- Versions
- 23