Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/emicklei/mora

MongoDB generic REST server in Go
https://github.com/emicklei/mora

Last synced: 20 days ago
JSON representation

MongoDB generic REST server in Go

Awesome Lists containing this project

README

        

# ![](static/Letter-M-icon.png) Mora - Mongo Rest API

#### REST server for accessing MongoDB documents and meta data

##### Documents

When querying on collections those parameters are available:

query - use mongo shell syntax, e.g. {"size":42}
limit - maximum number of documents in the result
skip - offset in the result set
fields - comma separated list of (path-dotted) field names
sort - comma separated list of (path-dotted) field names
extended_json - set to "true" to return responses in [MongoDB Extended JSON](http://docs.mongodb.org/manual/reference/mongodb-extended-json/) format

##### Examples

###### Listing aliases

$ curl 'http://127.0.0.1:8181/docs/' \
> -D - \
> -H 'Accept: application/json'
HTTP/1.1 200 OK
Content-Type: application/json
Date: Tue, 22 Apr 2014 07:06:30 GMT
Content-Length: 61

{
"success": true,
"data": [
"test",
"local"
]
}

###### Listing databases

$ curl 'http://127.0.0.1:8181/docs/local/' \
> -D - \
> -H 'Accept: application/json'
HTTP/1.1 200 OK
Content-Type: application/json
Date: Tue, 22 Apr 2014 07:07:11 GMT
Content-Length: 61

{
"success": true,
"data": [
"local",
"use1"
]
}

###### Listing collections

$ curl 'http://127.0.0.1:8181/docs/local/local' \
> -D - \
> -H 'Accept: application/json'
HTTP/1.1 200 OK
Content-Type: application/json
Date: Tue, 22 Apr 2014 07:24:10 GMT
Content-Length: 98

{
"success": true,
"data": [
"new-collection",
"startup_log",
"system.indexes"
]
}

###### Inserting document

$ curl 'http://127.0.0.1:8181/docs/local/local/new-collection/document-id' \
-D - \
-X POST \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
--data '{"title": "Some title", "content": "document content"}'

HTTP/1.1 201 Created
Content-Location: /docs/local/local/new-collection/document-id
Content-Type: application/json
Date: Tue, 22 Apr 2014 07:23:33 GMT
Content-Length: 116

{
"success": true,
"data": {
"created": true,
"url": "/docs/local/local/new-collection/document-id"
}
}

###### Finding document

$ curl 'http://127.0.0.1:8181/docs/local/local/new-collection/document-id' \
> -D - \
> -H 'Accept: application/json'
HTTP/1.1 200 OK
Content-Type: application/json
Date: Tue, 22 Apr 2014 07:32:33 GMT
Content-Length: 123

{
"success": true,
"data": {
"_id": "document-id",
"content": "document content",
"title": "Some title"
}
}

###### Finding documents

$ curl 'http://127.0.0.1:8181/docs/local/local/new-collection?limit=1&skip=1' \
> -D - \
> -H 'Accept: application/json'
HTTP/1.1 200 OK
Content-Type: application/json
Date: Wed, 23 Apr 2014 23:18:39 GMT
Content-Length: 387

{
"success": true,
"prev_url": "/docs/local/local/new-collection?limit=1\u0026skip=0",
"next_url": "/docs/local/local/new-collection?limit=1\u0026skip=2",
"data": [
{
"_id": "535849cfb734f91cdc000002",
"content": "document content",
"title": "Some title"
}
]
}

###### Updating document

$ curl 'http://127.0.0.1:8181/docs/local/database/new-collection/document-id' \
> -D - \
> -X PUT \
> -H 'Content-Type: application/json' \
> -H 'Accept: application/json' \
> --data '{"title": "New title"}'
HTTP/1.1 200 OK
Content-Location: /docs/local/database/new-collection/document-id
Content-Type: application/json
Date: Tue, 22 Apr 2014 06:37:02 GMT
Content-Length: 133

{
"success": true,
"data": {
"created": false,
"url": "/docs/local/database/new-collection/document-id"
}
}

###### Updating documents

$ curl 'http://127.0.0.1:8181/docs/local/local/new-collection' \
> -D - \
> -X PUT \
> -H 'Content-Type: application/json' \
> -H 'Accept: application/json' \
> --data '{"$set": {"title": "New title"}}'
HTTP/1.1 200 OK
Content-Type: application/json
Date: Wed, 23 Apr 2014 23:33:11 GMT
Content-Length: 22

{
"success": true
}

###### Removing document

$ curl 'http://127.0.0.1:8181/docs/local/local/new-collection/document-id' \
> -D - \
> -X DELETE \
> -H 'Accept: application/json'
HTTP/1.1 200 OK
Content-Type: application/json
Date: Tue, 22 Apr 2014 07:42:47 GMT
Content-Length: 22

{
"success": true
}

###### Removing collection

$ curl 'http://127.0.0.1:8181/docs/local/local/new-collection' \
> -D - \
> -X DELETE \
> -H 'Accept: application/json'
HTTP/1.1 200 OK
Content-Type: application/json
Date: Tue, 22 Apr 2014 07:43:24 GMT
Content-Length: 22

{
"success": true
}

##### Statistics

###### Database statistics

$ curl http://127.0.0.1:8181/stats/local/local -D -
HTTP/1.1 200 OK
Content-Type: application/json
Date: Tue, 22 Apr 2014 08:17:46 GMT
Content-Length: 341

{
"success": true,
"data": {
"avgObjSize": 595.6,
"collections": 3,
"dataFileVersion": {
"major": 4,
"minor": 5
},
"dataSize": 5956,
"db": "local",
"fileSize": 67108864,
"indexSize": 0,
"indexes": 0,
"nsSizeMB": 16,
"numExtents": 3,
"objects": 10,
"ok": 1,
"storageSize": 10502144
}
}

###### Collection statistics

$ curl http://127.0.0.1:8181/stats/local/local/startup_log -D -
HTTP/1.1 200 OK
Content-Type: application/json
Date: Tue, 22 Apr 2014 08:18:16 GMT
Content-Length: 389

{
"success": true,
"data": {
"avgObjSize": 728,
"capped": true,
"count": 8,
"indexSizes": {},
"lastExtentSize": 10485760,
"max": 9223372036854775807,
"nindexes": 0,
"ns": "local.startup_log",
"numExtents": 1,
"ok": 1,
"paddingFactor": 1,
"size": 5824,
"storageSize": 10485760,
"systemFlags": 0,
"totalIndexSize": 0,
"userFlags": 0
}
}

### Install from source

go get -u github.com/emicklei/mora

### Create a release

sh release.sh

### Configuration

Mora uses a simple properties file to specify host,port,aliases and other options

# listener info is required
http.server.host=localhost
http.server.port=8181

# enable cross site requests
http.server.cors=true

# for swagger support (optional)
swagger.path=/apidocs/
swagger.file.path=./swagger-ui/dist

# mongo instances are listed here; specify an alias for each
mongod.{alias}.host=localhost
mongod.{alias}.port=27017
# initial and operational timeout in seconds
mongod.{alias}.timeout=5
# optional authentication
mongod.{alias}.username=
mongod.{alias}.password=
mongod.{alias}.database=
# read preference mode
# supported options (case-insensitive): https://godoc.org/gopkg.in/mgo.v2#Mode
mongod.{alias}.mode=primary
# alternatively, a mongodb connection string uri can be used instead
# supported options: https://godoc.org/gopkg.in/mgo.v2#Dial
mongod.{alias}.uri=mongodb://myuser:mypass@localhost:40001,otherhost:40001/mydb

# enable /stats/ endpoint
mora.statistics.enable=true

### Run

$ mora -config mora.properties

### Swagger

Swagger UI is displaying automatically generated API documentation and playground.

![Swagger UI](https://s3.amazonaws.com/public.philemonworks.com/mora/mora-2013-08-04.png)


© 2013, http://ernestmicklei.com. MIT License
- Icons from http://www.iconarchive.com, CC Attribution 3.0
- Swagger from https://github.com/wordnik/swagger-core/wiki, Apache License, Version 2.0