Skip to main content

A lightweight wrapper around pymongo to access MongoDB documents and subdocuments through custom user-defined classes.

Documents are returned as UserDict subclasses:

  • convenient pass-through to find() and find_one()

  • convenient load_by_id() to locate documents by ObjectId

  • smart save() function to insert, upsert or replace documents as appropriate

  • automatically record document creation and update times

  • track separate object schema versions

  • support polymorphic user objects loaded from the same collection

Subdocuments are accessed through dictionary proxy objects:

  • returned as their own classes independent of the parent MongoDB document class

  • data access is proxied back to the parent so no separate database access is performed

  • subdocuments have their own unique URL-safe ID useful for loading the data

  • subdocuments can be grouped in either dictionary or list containers

  • polymorphic subdocuments are supported within the same container

  • using subdocuments avoids “JOIN-like” additional database queries across collections

Example

Imagine an event ticketing system with a single MongoDB collection containing documents like the following:

{
    'name' : 'Fabulous Event',
    'date' : '...',      # datetime
    'desc' : 'This will be a lot of fun'
    'ticketTypes' : {
        '1' : {
            'name' : 'VIP Ticket',
            'desc' : 'Front-row seating; comes with a free plushie',
            'cost' : 200,
            'quantity' : 10,
        },
        '2' : {
            'name' : 'General Seating',
            'desc' : 'Everyone is welcome!',
            'cost' : 100,
            'quantity' : 100,
        },
    },
    'tickets' : [
        {
            'holder' : 'Fred',
            'purchased' : '...'      # datetime
            'ticketType' : 2,
        },
        {
            'holder' : 'Susan',
            'purchased' : '...'      # datetime
            'ticketType' : 1,
        },
    ]
}

MongoUserDict

mongo_objects allows us to create our own class for viewing these event documents:

class Event( mongo_objects.MongoUserDict ):

    db = ...     # provide your pymongo database object here
    collection_name = 'events'

    def isFuture( self ):
        return self['date'] >= datetime.utcnow()

Loop through all events:

for event in Event.find():
    ...

Create a new event:

myevent = Event( {
    'name' : '...',
    'date' : '...',
} )
myevent.save()

Record the unique ID (ObjectId) of an event:

eventId = myevent.id()

Locate an event by its ID:

myevent = Event.load_by_id( eventId )

Call a method on our custom object:

myevent.isFuture()

MongoDictProxy

mongo_objects allows us to create additional proxy classes for managing subdocuments. The proxy classes behave like dictionaries but redirect all access back to the parent MongoUserDict object. No additional database access is performed.:

class TicketTypes( mongo_objects.MongoDictProxy ):
    container_name = 'ticketTypes'

First load an Event document object:

event = Event.find_one()

Loop through the existing ticket type subdocuments within the parent Event:

for tt in TicketTypes.get_proxies( event ):
    ...

Obtain a specific proxy by key:

tt = TicketType.get_proxy( event, '1' )

Get the unique ID of a proxy item:

ticket_type_id = tt.id()

Loading a proxy object by ID is a classmethod of the parent document class; the proxy can only exist once the parent document is loaded:

tt = Event.load_proxy_by_id( ticket_type_id, TicketTypes )

Create a new ticket type. A unique per-document key will be assigned automatically:

TicketType.create( event, {
    'name' : 'Student Ticket',
    'desc' : 'For our student friends',
    'cost' : 50,
    'quantity' : 25,
} )

Credits

Development sponsored by Headwaters Entrepreneurs Pte Ltd.

Originally developed by Frontier Tech Team LLC for the Wasted Minutes ™️ language study tool.

License

mongo_objects is made available to the community under the “MIT License”.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

mongo_objects-1.2.3.tar.gz (844.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

mongo_objects-1.2.3-py3-none-any.whl (14.9 kB view details)

Uploaded Python 3

File details

Details for the file mongo_objects-1.2.3.tar.gz.

File metadata

  • Download URL: mongo_objects-1.2.3.tar.gz
  • Upload date:
  • Size: 844.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.0 CPython/3.12.3

File hashes

Hashes for mongo_objects-1.2.3.tar.gz
Algorithm Hash digest
SHA256 eb89988ac60088360ca44779f5ae248d72faabe112c27a55d4b07d66408985a6
MD5 109f7a1fb14ef84262b31186c6d713d3
BLAKE2b-256 f0ad191a46851abd4fddc80b38e8532144029a56c103033c0a7b95fb42448b2f

See more details on using hashes here.

File details

Details for the file mongo_objects-1.2.3-py3-none-any.whl.

File metadata

  • Download URL: mongo_objects-1.2.3-py3-none-any.whl
  • Upload date:
  • Size: 14.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.0.0 CPython/3.12.3

File hashes

Hashes for mongo_objects-1.2.3-py3-none-any.whl
Algorithm Hash digest
SHA256 1e9cae6a89520c800e48ce798d797bd8d39cd17287fdf25e1b8f051b4206c270
MD5 e92462063e5394f43e8b92c18b7b50c0
BLAKE2b-256 ccfd6657e9d97212a9e3c13d2b5339b7565337db3e67475ae5782a4124ac8ca4

See more details on using hashes here.

Release history Release notifications | RSS feed

1.2.6

2 files

1.2.4

2 files

This release

1.2.3 This release

2 files

1.2.2

2 files

1.2.1

2 files

1.2.0

2 files

1.1.2

2 files

1.1.1

2 files

1.0.26

2 files

1.0.22

2 files

1.0.19

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page