tinydb icon indicating copy to clipboard operation
tinydb copied to clipboard

Document ID and existing unique value in the document

Open aptly-io opened this issue 1 year ago • 1 comments

When inserting documents and knowing a certain document property value (e.g. house-id) is unique, is there a way to tell tinydb to use that house-id as document ID?

Just found https://github.com/msiemens/tinydb/issues/351

The document_id_class is a class variable, it's for all tinydb's Table (looks not ideal at first sight).

Would this approach make sense: When inserting a new Mapping, first make it a Document(mapping, mapping.house-id) (where the doc_id equal to the house-id). However Document needs an int type doc_it. Should one also subclass Document to customize the doc_id's type and change the Table's document_class? When creating a Table sub-class, one also has to create TinyDB sub-class to modify its class variable table_class?

Is there a more elegant approach that I'm overlooking?

aptly-io avatar Nov 08 '23 08:11 aptly-io

This might be a recipe for others when a str as doc_id:


class _Document(dict):
    def __init__(self, value: Mapping, doc_id: str):
        super().__init__(value)
        self.doc_id = doc_id

class _Table(Table):
    document_class = _Document
    document_id_class = str
    def _get_next_id(self):
        raise NotImplementedError("doc_id should be self provided")

class _TinyDB(TinyDB):
    table_class = _Table


class Model:

    def __init__(self):
        self._db = _TinyDB("db.json")

There are some issue with table.py though when using _Document ...

aptly-io avatar Nov 08 '23 17:11 aptly-io