monger/README.md

115 lines
3.4 KiB
Markdown
Raw Normal View History

# Monger
2011-08-04 12:01:26 +00:00
2011-12-31 00:39:58 +00:00
Monger is an idiomatic Clojure wrapper around MongoDB Java driver. It offers powerful expressive query DSL, strives to support
every MongoDB 2.0+ feature and is well maintained.
2011-08-04 12:01:26 +00:00
2011-09-10 16:28:13 +00:00
2011-10-19 15:32:55 +00:00
## Project Goals
There is one MongoDB client for Clojure that has been around since 2009. So, why create another one? Monger authors
wanted a client that will
* Support most of MongoDB 2.0+ features but only those that really matter. Grouping the way it is done today, for example, does not (it is easier to just use Map/Reduce directly).
* Be well documented.
* Be well tested.
2011-10-19 15:41:49 +00:00
* Be maintained, not carry technical debt from 2009 forever.
2011-11-04 06:26:32 +00:00
* Integrate with libraries like clojure.data.json and Joda Time.
2011-10-19 15:41:49 +00:00
* Integrate usage of JavaScript files and ClojureScript (as soon as the compiler gets artifact it is possible to depend on for easy embedding).
* Learn from other clients like the Java and Ruby ones.
* Target Clojure 1.3.0 and later from the ground up.
2011-10-19 15:32:55 +00:00
2011-12-31 00:39:58 +00:00
2011-08-04 12:01:26 +00:00
## Usage
2011-12-31 00:39:58 +00:00
We are working on documentation guides & examples site for the 1.0 release. In the meantime, please refer to the [test suite](https://github.com/michaelklishin/monger/tree/master/test/monger/test) for code examples.
## Powerful Query DSL
2011-08-04 12:01:26 +00:00
2011-12-31 00:39:58 +00:00
Every application that works with data stores has to query them. As a consequence, having an expressive powerful query DSL is a must
for client libraries like Monger.
Here is what monger.query DSL feels like:
``` clojure
(with-collection "docs"
(find { :inception_year { $lt 2000 $gte 2011 } })
(fields { :inception_year 1 :name 1 })
(skip 10)
(limit 20)
(batch-size 50)
(hint "my-index-name")
(snapshot))
```
2011-12-31 00:39:58 +00:00
It is easy to add new DSL elements, for example, adding pagination took literally less than 10 lines of Clojure code. Here is what
it looks like:
``` clojure
(with-collection coll
(find {})
(paginate :page 1 :per-page 3)
(sort { :title 1 })
(read-preference ReadPreference/PRIMARY))
```
Query DSL supports composition, too:
``` clojure
(let
[top3 (partial-query (limit 3))
by-population-desc (partial-query (sort { :population -1 }))
result (with-collection coll
(find {})
(merge top3)
(merge by-population-desc))]
;; ...
)
```
More code examples can be found [in our test suite](https://github.com/michaelklishin/monger/tree/master/test/monger/test).
2011-09-08 20:27:49 +00:00
## This is a Work In Progress
2011-09-08 20:27:49 +00:00
2011-10-19 15:32:55 +00:00
Core Monger APIs are stabilized but it is still a work in progress. Keep that in mind. 1.0 will be released in late 2011.
2011-09-10 16:28:13 +00:00
## Artifacts
2011-10-22 10:51:58 +00:00
Snapshot artifacts are [released to Clojars](https://clojars.org/com.novemberain/monger) every 24 hours.
With Leiningen:
2011-12-31 00:39:58 +00:00
[com.novemberain/monger "1.0.0-SNAPSHOT"]
With Maven:
<dependency>
<groupId>com.novemberain</groupId>
<artifactId>monger</artifactId>
2011-12-31 00:39:58 +00:00
<version>1.0.0-SNAPSHOT</version>
</dependency>
## Continuous Integration
[![Continuous Integration status](https://secure.travis-ci.org/michaelklishin/monger.png)](http://travis-ci.org/michaelklishin/monger)
2011-12-31 00:39:58 +00:00
CI is hosted by [travis-ci.org](http://travis-ci.org).
## Supported Clojure versions
Monger is built from the ground up for Clojure 1.3 and up.
2011-09-08 20:27:49 +00:00
2011-08-04 12:01:26 +00:00
## License
Copyright (C) 2011 Michael S. Klishin
2011-08-04 12:01:26 +00:00
2011-10-16 13:03:14 +00:00
Distributed under the [Eclipse Public License](http://www.eclipse.org/legal/epl-v10.html), the same as Clojure.