Как отфильтровать размер массива в rethinkdb?

У меня есть таблица с кучей документов, которые регулярно (частично) обновляются.

По сути, я пытаюсь создать еще одну таблицу (называемую changes ниже), в которой хранятся последние N изменений в каждом из этих документов.

Таким образом, я делаю table.changes(), чтобы получить все изменения в таблице, вычисляя нужную информацию о различиях (называемую diffentry ниже) и добавляя эту информацию к массиву в другой таблице:

changes.get(doc_id).update({
    'diffs': R.row['changes'].prepend(diffentry)
}).run()

Этот сложный момент заключается в том, как ограничить размер массива diffs?

Существует метод массива delete_at(), который может удалить один или несколько элементов из массива, который я мог бы просто вызвать "грубой силой", например:

delete_at(diff_limit, diff_limit + 10000)

и игнорировать любую ошибку (безумный верхний предел — это просто паранойя). Но это как-то грязно...

Я подумал, что лучше и лучше будет фильтровать массивы, превышающие лимит, и удалять лишние биты. Псевдо:

changes.get(doc_id).filter(R.row['diffs'].length > diff_limit).update({
    'diffs': R.row['diffs'].delete_at(diff_limit, R.row['diffs'].length - 1)
}).run()

Но, увы, нет length, который я нашел... Есть идеи, как красиво это сделать?


person pythonator    schedule 23.09.2015    source источник


Ответы (1)


В JS вы можете использовать функцию с .count() следующим образом:

update(function(doc){
       return {
          diffs: doc("diffs").deleteAt(diff_limit, doc("diffs").count())
       }
   }
).run()

Думаю в питоне должно быть что-то подобное.

person Suvitruf - Andrei Apanasik    schedule 23.09.2015
comment
хм, ну, это было неловко... count(), должно быть, был единственным, что я не пробовал... И я никогда не связывал потоковый вариант подсчета с подсчетом массива, дох! Но спасибо! - person pythonator; 23.09.2015