Версии документов Python + MongoDB - PullRequest
4 голосов
/ 06 августа 2011

У меня в работе находится приложение для внутреннего использования в качестве трекера проектов / задач в компании, в которой я работаю.Играя с MongoDB банкомат.Я имею в виду следующую псевдосхему:

task
    _id
    name
    project
    initial_notes
    versions
        number
        versions
            version_1
                worker
                status
                date(if submitted)
                review_notes(if rejected)
                reply_on(if accepted/rejected)
            (version_n)(if any)

Проблема, с которой я сталкиваюсь, заключается в создании версии задачи.Я прочитал несколько возможных способов, но я не понимаю их на всем пути.Я прочитал что-то, что мне понравилось здесь и мне действительно нравится, как mongoid делает это версия

Думая об этом лучше, я бы предпочел что-то вроде этого

task
    _id
    versions
        number_of_versions: 3
        current_version
            version_no: 3
            worker: bob
            status: accepted
        old_versions
            version
                version_no: 2
                worker: bob

Я хотел бы показывать самую последнюю версию только при отображении набора задач, и я хотел бы показывать все версии конкретной задачи при входе на страницу подробной информации для этой конкретной задачи.Будет ли эта структура работать?Если да, какие запросы нужно было бы выполнить, чтобы достичь того, что мне нужно?

Заранее спасибо за то, что уделили мне время на чтение и, возможно, ответили на него.статус: отклонена версия version_no: 1 работник: кузнец статус: отклонено

Ответы [ 2 ]

4 голосов
/ 06 августа 2011

Да, почему бы и нет. Эта схема будет работать. Кроме того, вы рассматривали что-то вроде этого:

task 
    ...
    versions = [       # MongoDB array 
        {   version_id 
            worker
            status
            date(if submitted)
            review_notes(if rejected)
            reply_on(if accepted/rejected)
        },
        { version_id : ... }, 
        ... 

Возможный запрос вставки версии:

tasks.update( { # a query to locate a particular task}, 
              { '$push' : { 'versions', { # new version } } } )

Обратите внимание, что получение последней версии из массива версий в этом случае выполняется программой, а не Mongo.

3 голосов
/ 06 августа 2011

Вы можете также рассмотреть такую ​​модель:

task
    _id
    ...
    old_versions [
        {
            retired_on
            retired_by
            ...
        }
    ]

Это имеет то преимущество, что ваши текущие данные всегда находятся на верхнем уровне (вам не нужно явно отслеживать текущую версию, документ является собственной текущей версией), и вы можете легко отслеживать историю, взяв текущую версию. , удалив поле old_versions и $push добавив его в поле old_versions в БД.

Поскольку вы, похоже, хотели минимизировать сетевой ввод-вывод, это также позволяет вам легко избежать загрузки old_versions, когда они вам не нужны:

> db.tasks.find({...}, {old_versions: 0})

Вы также можете стать более любопытным и хранить список старых версий только полей, которые были изменены. Это требует более деликатного кода на уровне приложения и может не потребоваться, если вы не ожидаете, что много изменений или эти документы будут очень большими.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...