forked from namlook/mongokit
-
Notifications
You must be signed in to change notification settings - Fork 0
/
README
198 lines (153 loc) · 7.65 KB
/
README
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
========
MongoKit
========
MongoDB_ is a great schema-less document oriented database. It have a lot of
driver for many langages (python, ruby, perl, java, php...).
.. _MongoDB : http://www.mongodb.org/display/DOCS/Home
MongoKit is a python module that brings structured schema and validation layer
on top of the great pymongo driver. It has be written to be as simple and light
as possible with the KISS and DRY principles in mind.
Philosophy
==========
MongoKit is designed to be:
* **simple**: MongoKit use plain python type to describe document structure
* **fast**: MongoKit is fast but if you *really* need to be fast you have access to the raw pymongo layer without changing the API
* **powerful**: MongoKit brings many feature like document auto-reference, custom types or i18n support.
.. topic:: **Your data is clean**:
"Tools change, not data". In order to follow this "credo", MongoKit won't
add any information into your data saved into the database.
So if you need to use other mongo tools or ODMs in other languages, your
data won't be polluted by MongoKit's stuff.
Features
========
* schema validation (wich use simple python type for the declaration)
* schema less feature
* doted notation
* nested and complex schema declaration
* untyped field support
* required fields validation
* default values
* custom validators
* cross database document reference
* random query support (which returns a random document from the database)
* inheritance and polymorphisme support
* versionized document support (in beta stage)
* partial auth support (it brings a simple User model)
* operator for validation (currently : OR, NOT and IS)
* simple web framework integration
* import/export to json
* i18n support
* GridFS support
* document migration support
Go to the full documentation_ .
.. _documentation : http://namlook.github.com/mongokit/
A quick example
===============
Document are enhanced python dictionary with a ``validate()`` method.
A Document declaration look like that::
>>> from mongokit import *
>>> import datetime
>>> connection = Connection()
>>> @connection.register
... class BlogPost(Document):
... structure = {
... 'title':unicode,
... 'body':unicode,
... 'author':unicode,
... 'date_creation':datetime.datetime,
... 'rank':int
... }
... required_fields = ['title','author', 'date_creation']
... default_values = {'rank':0, 'date_creation':datetime.datetime.utcnow}
...
We fire a connection and register our objects.
>>> blogpost = con.test.example.BlogPost() # this use the db "test" and the collection "example"
>>> blogpost['title'] = u'my title'
>>> blogpost['body'] = u'a body'
>>> blogpost['author'] = u'me'
>>> blogpost
{'body': u'a body', 'title': u'my title', 'date_creation': datetime.datetime(...), 'rank': 0, 'author': u'me'}
>>> blogpost.save()
Saving the object will call the `validate()` method.
And you can use more complex structure::
>>> @connection.register
... class ComplexDoc(Document):
... __database__ = 'test'
... __collection__ = 'example'
... structure = {
... "foo" : {"content":int},
... "bar" : {
... 'bla':{'spam':int}
... }
... }
... required_fields = ['foo.content', 'bar.bla.spam']
Please, see the tutorial_ for more examples.
.. _tutorial : http://namlook.github.com/mongokit/tutorial.html
Suggestion and patches are really welcome. If you find mistakes in the documentation
(english is not my primary langage) feel free to contact me. You can find me (namlook)
on the freenode #mongodb irc channel or on twitter_.
.. _twitter : http://twitter.com/namlook
Recent Change Log
=================
v0.8.2
------
* fix #101 - validators condition fix
* fix #110 - support PyMongo >= 2.4 (import MongoClient) -- thanks to @mattbodman and @zavatskiy
* Fixed some spelling/grammar (thanks to @gekitsuu)
v0.8.1
------
* support python 2.3
* small updates to validation messages (Merge pull request #94 from unpluggd/master)
* Fixes formatting error when throwing MaxDocumentSizeError in Document.validate() (Merge pull request #99 from apavlo/master)
* Fixed typo when throwing MaxDocumentSizeError in validate() (thanks to Andy Pavlo)
* added fix for unconditional access to __wrap on cursors (thanks to David T. Lehmann)
* added test for __getitem__ on cursor with undefined __wrap (thanks to David T. Lehmann)
* __getitem__ on unwrapped cursor checkes if __wrap is None (Merge pull request #97 from dtl/fix-getitem-on-unwrapped-cursor)
* Add .travis.yml for Travis CI (http://travis-ci.org/) (Merge pull request #96 from msabramo/travis)
* Fixed a very minor rendering issue in the docs (Merge pull request #95 from d0ugal/master)
* Fixed rendering issue in the docs. (thanks to Dougal Matthews)
* tweaked the error messages in validation for missing and unknown fields to aid in debugging projects (thanks to Phillip B Oldham)
v0.8.0
------
* Add spec file for rpm-based distributions (Merge pull request #63 from linuxnow/master)
* change document size limitation for mongodb 1.8 or later. Thanks to Aleksey Sivokon (Merge pull request #74 from key/master)
* validation of "" for an int (Merge pull request #79 from barnybug/master)
* Fix exception when loading documents with a custom type field missing (Merge pull request #80 from barnybug/master)
* Big documentation restructuration made by Sean Lynch (Merge pull request #82 from sean-lynch/master)
* Using rename no longer causes migrations throw an exception (Merge pull request #86 from matthewh/master)
* Some test is modified and added tox (Merge pull request #91 from aircastle/modifiytest)
* Replace pymongo.objectid with bson.objectid (Merge pull request #88 from behackett/master)
* Added Support for additional keyword-arguments for index-creation (Merge pull request #85 from mfelsche/master)
* Remove anyjson dependency and use builtin json instead
Thank you all for all your patches !
v0.7.2
------
* add inherited queries support (please see http://github.com/namlook/mongokit/wiki/Inherited-queries for more details)
v0.7.1
------
* change MongokitMasterSlaveConnection to MasterSlaveConnection for consistency
* fix #57 -- support pymongo > 1.9 in grid.py
* fix #45 -- remove automatique index creation
* fix #43 -- slicing a cursor should return a mongokit document, not dict
* Dont try to convert None struct to json (patch from @mLewisLogic thanks !)
* fix schemaless issue (thanks to Mihai Pocorschi for reporting it)
v0.7
----
* add `use_schemaless` feature ! please see the documentation for more informations
* Add equality test for mongokit operators (thanks to @allancaffee)
This allows developers to write unit tests on the structure
of their document classes when operators are used
* roll back find_and_modify for master branch (need pymongo 1.10 for that)
* many documentation fixes
* fix #55 -- Bug in VersionedDocument remove() method
* fix #53 -- Fixed a few spelling errors in README
* fix #52 -- Advanced bulk migration docs example is broken
* fix #51 -- pymongo.dbref is deprecated, use bson.dbref instead
* fix #49 -- Can't specify default values for lists of embedded objects
* fix #48 -- uuid.UUID support
* fix #41 -- add basestring to authorized types
* fix #40 -- Made some enhancements
* fix #39 -- KeyError when saving partially loaded documents
* fix #34 -- add find_and_modify method to Document
* fix #32 -- allow the structure to be empty (was: document.to_json())
* fix #24 -- Don't handle __database__/__collection__ attribute for virtual documents