Пилю древовидные комментарии с хранением в монге. Сейчас функция черновая и имеет такой вид:
def add_comment(cid, pid=None, b='testcom'):
query = {
'_id':cid,
'path':pid,
'created':dt.now(),
'body':b,
'depth':0,
'orderid':1,
'answers':0
}
if pid:
parent = comments.find_one({"_id":pid})
if parent['path']:
query['path']="%s:%s" % ( str(pid), parent['path'] )
else:
query['path']=str(pid)
query['depth']= parent['depth']+1
query['orderid'] = parent['orderid'] + parent['answers'] + 1
comments.update({"_id": pid}, {"$inc":{'answers':1}})
comments.update({"orderid":{"$gte":query['orderid']} }, {"$inc":{'orderid':1}}, multi=True)
else:
last_order_id = comments.find({}).sort([('orderid',-1)]).limit(1)
last_order_id = list(last_order_id)
if last_order_id:
query['orderid'] = last_order_id[0]['orderid'] + 1
else:
query['orderid'] = 1
comments.insert(query)
Функция расчитана на простое обращение к бд, чтобы с одного запроса получить уже готовый отсортированный список комментов.
Смущают эти три строчки кода выполняющиеся последовательно:
comments.update({"_id": pid}, {"$inc":{'answers':1}})
comments.update({"orderid":{"$gte":query['orderid']} }, {"$inc":{'orderid':1}}, multi=True)
comments.insert(query)
Теоретически, при многопоточном добавлении комментариев при инсерте документа можно сбить последовательность 'orderid' и сделать там повторяющиеся числа. Как такого избежать?
UPD:
Код работает неверно. Правильная версия: https://bitbucket.org/develf/mongo-tree-comments/src/67a6c392c5ed05166df6882f...