2015-05-13 46 views
0

我目前正在通过rethinkdb python tutorial基于序列项目的rethinkdb聚合

目前,我有4个超级英雄。在下面的示例中,heroesr.db("python_tutorial").table("heroes")的别名。

In[45]: list(heroes.run()) 
Out[44]: 
[{u'appearances_count': 98, 
    u'hero': u'Wolverine', 
    u'id': u'28b6a53f-14c6-4a36-bb0b-45a6fb9c77c9', 
    u'magazine_titles': [u'Amazing Spider-Man vs. Wolverine', 
    u'Avengers', 
    u'X-MEN Unlimited', 
    u'Magneto War', 
    u'Prime'], 
    u'name': u"James 'Logan' Howlett"}, 
{u'aka': [u'Magnus', u'Erik Lehnsherr', u'Lehnsherr'], 
    u'appearances_count': 42, 
    u'hero': u'Magneto', 
    u'id': u'19274b39-f829-4daa-ba2b-24fd680e01c6', 
    u'magazine_titles': [u'Alpha Flight', u'Avengers', u'Avengers West Coast'], 
    u'name': u'Max Eisenhardt'}, 
{u'appearances_count': 72, 
    u'hero': u'Storm', 
    u'id': u'69848f10-2f5a-48f4-8d87-c310b88f9487', 
    u'magazine_titles': [u'Amazing Spider-Man vs. Wolverine', 
    u'Excalibur', 
    u'Fantastic Four', 
    u'Iron Fist'], 
    u'name': u'Ororo Monroe'}, 
{u'appearances_count': 72, 
    u'hero': u'Professor Xavier', 
    u'id': u'22dd3ab1-60d6-4679-9c39-2ad7da6e48d0', 
    u'magazine_titles': [u'Alpha Flight', u'Avengers', u'Bishop', u'Defenders'], 
    u'name': u'Charles Francis Xavier'}] 

我会像做的是英雄群像按照杂志的标题,他们在所以,我试图建立一个查询时,会看到这样的以下内容:

u'Prime' 
{ u'name': u"James 'Logan' Howlett"} 
u'Fantastic Four' 
{ u'name': u'Ororo Monroe'} 
u'Excalibur' 
{ u'name': u'Ororo Monroe'} 
u'Defenders' 
{ u'name': u'Charles Francis Xavier'} 
u'Magneto War' 
{ u'name': u"James 'Logan' Howlett"} 
u'Bishop' 
{ u'name': u'Charles Francis Xavier'} 
u'Avengers West Coast' 
{ u'name': u'Max Eisenhardt'} 
u'Amazing Spider-Man vs. Wolverine' 
{ u'name': u"James 'Logan' Howlett"} 
{ u'name': u'Ororo Monroe'} 
u'X-MEN Unlimited' 
{ u'name': u"James 'Logan' Howlett"} 
u'Alpha Flight' 
{ u'name': u'Charles Francis Xavier'} 
{ u'name': u'Max Eisenhardt'} 
u'Avengers' 
{ u'name': u"James 'Logan' Howlett"} 
{ u'name': u'Charles Francis Xavier'} 
{ u'name': u'Max Eisenhardt'} 
u'Iron Fist' 
{ u'name': u'Ororo Monroe'} 

我已设法通过两个单独查询。这里基本上是我所做的:

In[46]: titles = list(heroes.concat_map(lambda hero: hero["magazine_titles"]).distinct().run()) 
In[47]: titles 
Out[46]: 
[u'Alpha Flight', 
u'Amazing Spider-Man vs. Wolverine', 
u'Avengers', 
u'Avengers West Coast', 
u'Bishop', 
u'Defenders', 
u'Excalibur', 
u'Fantastic Four', 
u'Iron Fist', 
u'Magneto War', 
u'Prime', 
u'X-MEN Unlimited'] 

上面给出了我所有标题的列表。然后,我只是搜索数据库,看看这些标题是不是英雄的magazine_titles。像这样:

In[48]: from collections import defaultdict 
In[49]: title_data = defaultdict(list) 
In[57]: for title in titles: 
...   title_data[title] = list(heroes.filter(lambda hero: hero["magazine_titles"].contains(title)).pluck("name").run()) 
In[59]: for title, heroes in title_data.items(): 
...  pprint(title) 
...  pprint(heroes, indent=4) 

不过,我想这样做是一个查询。关于所述查询,它会比像我这样做两个单独的查询更有效吗?

回答

2

group命令multi应该做你想要什么:

heroes.group('magazine_titles', multi=True)['name'] 
+0

太谢谢你了!有没有我可以使用的食谱?或者我可以使用的任何预创建的数据集都有复杂的数据类型? –

+0

我不认为这确实存在,但是您可以使用'r.http'命令从公共apis导入数据(例如,像Reddit)。 'r.db( '数据库')。表( '书签交易').insert(r.http( 'http://www.reddit.com/r/javascript.json')( '数据')('儿童).MAP(r.row( '数据')))' –