基于序列项的rethinkdb聚合
rethinkdb aggregation based on sequence items
我目前正在经历 rethinkdb python tutorial。
目前,我有4个超级英雄。在下面的示例中,heroes
是 r.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)
但是,我想在 one 查询中执行此操作。关于上述查询,它会比像我那样做两个单独的查询更有效率吗?
带有 multi
的 group 命令应该可以满足您的要求:
heroes.group('magazine_titles', multi=True)['name']
我目前正在经历 rethinkdb python tutorial。
目前,我有4个超级英雄。在下面的示例中,heroes
是 r.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)
但是,我想在 one 查询中执行此操作。关于上述查询,它会比像我那样做两个单独的查询更有效率吗?
带有 multi
的 group 命令应该可以满足您的要求:
heroes.group('magazine_titles', multi=True)['name']