2013-06-26 6 views
3

В моем приложении, у меня есть модель деятельности отслеживания сайта:Агрегирование на ReferenceField в Mongoengine

class FeedItem(Document): 
    user = ReferenceField('User') 
    link = ReferenceField('Link') 
    issue = ReferenceField('Threat') 
    action = StringField(required=True, max_length=1000) 
    datetime = DateTimeField(required=True) 

... где я следить за то, что пользователи делают с содержанием.

Я пытаюсь создать список «лучших пользователей», где я объединяю список пользователей теми, кто внес наибольший вклад (по крайней мере, по определению, по количеству раз, которое они отображаются в журнале).

Я попытался это:

user_freqs = FeedItem.objects.item_frequencies('user', normalize=True) 
top_users = sorted(user_freqs.items(), key=itemgetter(1), reverse=True)[:10] 

(на основе this example)

Но я понял, что это не работает, потому что item_frequencies() не работает на ReferenceFields.

Я новичок в этом, и я нахожусь в убытке. Любая помощь будет принята с благодарностью. Благодаря!

ответ

3

Я бы рекомендовал использовать необработанные pymongo и структуру агрегации, свою простую группу по FeedItem.user и $sum.

+0

Спасибо. Мне сложно определить синтаксис для передачи aggregate() с использованием ключевого слова __raw__ - из документов, я могу видеть, как это сделать для более простых запросов. Вот что у меня есть, что неправильно: 'top_users = User.objects (__ __ сырым = совокупный ({....' Очевидно, я не понимая, как это должно работать (это мой первый раз, когда все ж из этого). Thx снова за вашей помощью. – nickgrossman

+1

О, я думаю, вы на самом деле имеете в виду «raw pymongo», а не ключевое слово __raw__. Попробуем это. – nickgrossman

+0

Да, это сработало. – nickgrossman