It covers operations such as: 1. Document initialization. 2. Accessing/setting attributes on a Document instance. 3. Serializing a Document instance (via `to_mongo`). 4. Deserializing a Document instance (via `_from_son`). 5. Serializing + saving a Document in the database (via `save`). 5. Loading a Document from the database + deserializing (via `Doc.objects[0]`). And it does so for both basic flat documents and more complex nested docs.
		
			
				
	
	
		
			113 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			113 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import unittest
 | |
| from timeit import repeat
 | |
| 
 | |
| import mongoengine
 | |
| from mongoengine import (BooleanField, Document, EmbeddedDocument,
 | |
|                          EmbeddedDocumentField, IntField, ListField,
 | |
|                          StringField)
 | |
| 
 | |
| conn_settings = {
 | |
|     'db': 'mongoengine-benchmark-test',
 | |
| }
 | |
| 
 | |
| mongoengine.connect(**conn_settings)
 | |
| 
 | |
| 
 | |
| def timeit(f, n=10000):
 | |
|     return min(repeat(f, repeat=3, number=n)) / float(n)
 | |
| 
 | |
| 
 | |
| def test_basic():
 | |
|     class Book(Document):
 | |
|         name = StringField()
 | |
|         pages = IntField()
 | |
|         tags = ListField(StringField())
 | |
|         is_published = BooleanField()
 | |
| 
 | |
|     Book.drop_collection()
 | |
| 
 | |
|     def init_book():
 | |
|         return Book(
 | |
|             name='Always be closing',
 | |
|             pages=100,
 | |
|             tags=['self-help', 'sales'],
 | |
|             is_published=True,
 | |
|         )
 | |
| 
 | |
|     print 'Doc initialization: %.3fus' % (timeit(init_book, 1000) * 10**6)
 | |
| 
 | |
|     b = init_book()
 | |
|     print 'Doc getattr: %.3fus' % (timeit(lambda: b.name, 10000) * 10**6)
 | |
| 
 | |
|     print 'Doc setattr: %.3fus' % (
 | |
|         timeit(lambda: setattr(b, 'name', 'New name'), 10000) * 10**6
 | |
|     )
 | |
| 
 | |
|     print 'Doc to mongo: %.3fus' % (timeit(b.to_mongo, 1000) * 10**6)
 | |
| 
 | |
|     def save_book():
 | |
|         b._mark_as_changed('name')
 | |
|         b._mark_as_changed('tags')
 | |
|         b.save()
 | |
| 
 | |
|     save_book()
 | |
|     son = b.to_mongo()
 | |
| 
 | |
|     print 'Load from SON: %.3fus' % (
 | |
|         timeit(lambda: Book._from_son(son), 1000) * 10**6
 | |
|     )
 | |
| 
 | |
|     print 'Save to database: %.3fus' % (timeit(save_book, 100) * 10**6)
 | |
| 
 | |
|     print 'Load from database: %.3fus' % (
 | |
|         timeit(lambda: Book.objects[0], 100) * 10**6
 | |
|     )
 | |
| 
 | |
| 
 | |
| def test_embedded():
 | |
|     class Contact(EmbeddedDocument):
 | |
|         name = StringField()
 | |
|         title = StringField()
 | |
|         address = StringField()
 | |
| 
 | |
|     class Company(Document):
 | |
|         name = StringField()
 | |
|         contacts = ListField(EmbeddedDocumentField(Contact))
 | |
| 
 | |
|     Company.drop_collection()
 | |
| 
 | |
|     def init_company():
 | |
|         return Company(
 | |
|             name='MongoDB, Inc.',
 | |
|             contacts=[
 | |
|                 Contact(
 | |
|                     name='Contact %d' % x,
 | |
|                     title='CEO',
 | |
|                     address='Address %d' % x,
 | |
|                 )
 | |
|                 for x in range(1000)
 | |
|             ]
 | |
|         )
 | |
| 
 | |
|     def create_company():
 | |
|         c = init_company()
 | |
|         c.save()
 | |
|         c.delete()
 | |
| 
 | |
|     print 'Save/delete big object to database: %.3fms' % (
 | |
|         timeit(create_company, 10) * 10**3
 | |
|     )
 | |
| 
 | |
|     c = init_company().save()
 | |
|     print 'Serialize big object: %.3fms' % (
 | |
|         timeit(c.to_mongo, 100) * 10**3
 | |
|     )
 | |
|     print 'Load big object from database: %.3fms' % (
 | |
|         timeit(lambda: Company.objects[0], 100) * 10**3
 | |
|     )
 | |
| 
 | |
| 
 | |
| if __name__ == '__main__':
 | |
|     test_basic()
 | |
|     test_embedded()
 |