Уведомления

Группа в Telegram: @pythonsu

#1 Май 18, 2012 00:52:06

alexandre1
От:
Зарегистрирован: 2008-07-21
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

mongodb и продвинутая сортировка.

Вот понадобилось по сортировать по нескольким полям. Но не один за другим а немного в древовидном порядке что ли.
Есть документы:

{"_id":"1", "num":"111", "parent":"_", "child":["3", "4"]}
{"_id":"2", "num":"222", "parent":"_", "child":"_"}
{"_id":"3", "num":"333", "parent":"1", "child":"_"}
{"_id":"4", "num":"444", "parent":"1", "child":"_"}
{"_id":"5", "num":"555", "parent":"_", "child":"_"}
Нужно чтоб они ишли в таком порядке:
1->3,4->2->5
То есть, сразу за любым документом должны идти те которые указаны у него в “child”.
Сам код сортировки выглядит примерно так:
db.doc.fund().sort([('parent', -1), ('num', -1)])
Сейчас получается такая последовательность:
3,4->1->2->5
То есть он группирует по parent но только в перед num или после него, может кто то сталкивался с чем то подобным?



Офлайн

#2 Май 18, 2012 07:04:32

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

mongodb и продвинутая сортировка.

docums=[
    {"_id":"4", "num":"444", "parent":"1", "child":"_"},
    {"_id":"1", "num":"111", "parent":"_", "child":["3", "4"]},
    {"_id":"3", "num":"333", "parent":"1", "child":"_"},
    {"_id":"5", "num":"555", "parent":"_", "child":"_"},
    {"_id":"6", "num":"555", "parent":"2", "child":"_"},
    {"_id":"2", "num":"222", "parent":"_", "child":["6"]},
    ]
for d in docums:
  try:
    int(d['parent'])
  except ValueError:
    d['parent']='0'
    
docums.sort(key=lambda x: int(x['_id']))
docums.sort(key=lambda x: int(x['parent'])  or int(x['_id']))     
     
for x in docums:
  print x
{'_id': '1', 'num': '111', 'parent': '0', 'child': ['3', '4']}
{'_id': '3', 'num': '333', 'parent': '1', 'child': '_'}
{'_id': '4', 'num': '444', 'parent': '1', 'child': '_'}
{'_id': '2', 'num': '222', 'parent': '0', 'child': ['6']}
{'_id': '6', 'num': '555', 'parent': '2', 'child': '_'}
{'_id': '5', 'num': '555', 'parent': '0', 'child': '_'}



Офлайн

#3 Май 18, 2012 17:25:50

alexandre1
От:
Зарегистрирован: 2008-07-21
Сообщения: 19
Репутация: +  0  -
Профиль   Отправить e-mail  

mongodb и продвинутая сортировка.

Хорошее решение но если база большая оно не совсем подходит потому что это все будет грузится в память. И поэтому хотелось бы сделать все это с помощью средств базы.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version