Попробуйте что-нибудь подобное. Сохраните счетчик, отслеживающий общее количество потоков, назовем его thread_count
, изначально установленным в 0, поэтому где-нибудь документ будет выглядеть как {thread_count:0}
.
Каждый раз, когда создается новый поток, сначала вызывайте findAndModify()
, используя {$inc : {thread_count:1}}
в качестве модификатора, т.е. увеличивайте счетчик на 1 и возвращайте его новое значение.
Затем, когда вы вставляете новый поток, используйте новое значение для счетчика в качестве значения для поля в его документе, назовем его post_order
.
Таким образом, каждый вставленный вами документ каждый раз имеет значение, равное 1. Например, первые 3 документа, которые вы вставите, будут выглядеть так:
{name:'foo', post_order:1, created_at:... } // value of thread_count is at 1
{name:'bar', post_order:2, created_at:... } // value of thread_count is at 2
{name:'baz', post_order:3, created_at:... } // value of thread_count is at 3
и т.д.
Таким образом, вы можете запрашивать и заказывать по post_order
как ASCENDING, и он будет возвращать их в порядке от самого старого к новейшему (или по убыванию от самого нового к старому).
Затем, чтобы «поднять» поток в порядке его сортировки при голосовании, вы можете вызвать update()
в документе с помощью {$inc:{post_order:1}}
. Это повысит его на 1 в порядке сортировки результатов. Если два потока имеют одинаковое значение для post_order, созданный_ат будет различать, какой из них идет первым. Таким образом, вы будете сортировать по post_order, created_at
.
Вам понадобится индекс для post_order
и created_at
.