Simple model based usage of pymongo, also provides optional feature for tracking mongoDB document history
Project description
Pymongo Model
With pymongo-model, it will be easier for you to use pymongo, as you will get a local copy of mongoDB document, you can do any change in the local copy (python object), changes will be committed from local copy to mongoDB only when you invoke save method like it happens in any ORM library.
SimpleModel object provides basic feature of updating mongo document locally and commiting at once.
Also,
You can use below models for document history tracking feature (that can be used for operations like undo)
- In DiffHistoryModelV1, we are storing a new document (in delta collection) which consists of version details as well as original document everytime it is updated.
- In DiffHistoryModelV2, we are using json-diff for calculating difference in the versions and storing just the difference object instead of entire document for versioning.
Installation
Supports Python 3+ To install, simply use pip
$ pip install pymongo-model
Usage
import pymongo
from bson.objectid import ObjectId
from pymongo_model import SimpleModel, DiffHistoryModelV1, DiffHistoryModelV2
MONGO_KEY = os.getenv('MONGO_KEY')
client = pymongo.MongoClient(MONGO_KEY)
db = client["your_database"]
Using SimpleModel
""" A simple model that wraps mongodb document
"""
class YourSimpleModel(SimpleModel):
collection = db.your_collection #mongo collection object
#Creating new document
player = Player({"username":"pankajsingh.08","name": "Pankaj Singh", "age": 25,"runs":300})
player.save() #commited in db
#Updating old document
player = Player({"_id":ObjectId("provide_doc_id_here")}) #provide mongo document id for fetching
player.reload() #this fetches data from db and maps to local dict object
player["city"] = "Hyderabad" #adding new key to document in local copy
player["username"] = "aa3pankaj" #updating old key in local copy
del player["age"] #deleting old key in local copy
player.save() #now everything will be committed at once in db
Using DiffHistoryModelV1
""" A simple model that wraps mongodb document,
Also creates a delta_collection for document revision tracking,
In this version of DiffHistoryModel, it creates below document in the delta_collection for each update i.e after invoking save method
{
"collection_name": name of the collection of the document for which revision is being done,
"document_id" : mongo id of document for which revision is being done,
"document": original document object from your collection for which revision is being done,
"_version": revision number of the document,
"is_latest":Boolean, true only for latest
}
"""
class Match(DiffHistoryModelV1):
#Refer https://api.mongodb.com/python/current/tutorial.html for creating db object
db_object = db #mongo client object
collection = db.your_collection #mongo collection object
delta_collection_name = "_delta_collection" #give any name for delta collection where revisions will be stored, it will be created automatically in the db
#Creating new document
match = Match({"username":"pankajsingh.08","name": "Pankaj Singh", "age": 25})
match.save() #commited in db
#Updating old document
match = Match({"_id":ObjectId("provide_doc_id_here")}) #provide mongo document id for fetching
match.reload() #this fetches data from db and maps to local dict object
match["city"] = "Pune" #adding new key to document in local copy
match.save() #commited in original collection, Also a new document is created in the delta_collection
#helper methods
doc_latest = match.get_latest_revision() #latest record in db
match.delete_latest_revision() #deletes latest record in delta_collection, and makes previos record as latest but original document will not be touched
match.undo() #deletes latest record in delta_collection, and makes previos record as latest, Also original document will be updated
Using DiffHistoryModelV2
""" A simple model that wraps mongodb document,
Also creates a delta_collection for document revision tracking, Only difference from DiffHistoryModelV1 is here instead of saving entire document, just difference is stored in diff.
In this version of DiffHistoryModel, it creates below document in the delta_collection for each update i.e after invoking save method
{
"collection_name": name of the collection of the document for which revision is being done,
"document_id" : mongo id of document for which revision is being done,
"diff": diff object generated from json-diff library (https://github.com/fzumstein/jsondiff)
"_version": revision number of the document,
}
"""
class Match(DiffHistoryModelV2):
#Refer https://api.mongodb.com/python/current/tutorial.html for creating db object
db_object = db #mongo client object
collection = db.your_collection #mongo collection object
delta_collection_name = "_delta_collection" #give any name for delta collection where revisions will be stored, it will be created automatically in the db
#Creating new document
match = Match({"username":"pankajsingh08","name": "Pankaj Singh", "age": "25"})
match.save() #commited in db
#Updating old document
match = Match({"_id":ObjectId("provide_doc_id_here")}) #provide mongo document id for fetching
match.reload() #this fetches data from db and maps to local dict object
match["city"] = "Pune" #adding new key to document in local copy
match.save() #commited in original collection, Also a new document is created in the delta_collection
Projects using pymongo-model
- PexaBot : A chatbot for cricket match scoring and stats analysis
Support
Find me on Linkedin
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distribution
Hashes for pymongo_model-2.0.0-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | e8722bb48c33738b163f35b5fae8e121aee782a2448b8493c507fca142805451 |
|
MD5 | c1d9e1797bbd256b538e1902f70c24e8 |
|
BLAKE2b-256 | a849d54640d3a124eb1c625720cb65d680c9e2f5d014880e1d4f26479ea4dc95 |