我有一个双重问题,这使我无法继续前进一段时间。我已经阅读了很多文章,多次检查了stackoverflow,并再次阅读了mongoengine的文档,但是找不到适合我的答案。我正在使用mongoDB来存储Flask Webb应用程序的数据。要查询数据库,我正在使用mongoengine。现在,假设我的用户模型如下所示:
Users
name: Superman
kudos:
0 0 date
1 category A
1 0 date
1 category B
name: Superman
kudos:
0 0 date
1 category A
1 0 date
1 category A
2 0 date
1 category B
kudo是嵌套的文档,每当用户收到kudo时就会创建它们。我将它们存储为db.ListField(date = now)。一切正常。
在关系数据库中,我将使用单独的kudo方案。我认为在mongoDB中,使用User集合创建嵌套文档将是更好的解决方案。否则,您仍在创建与他人有联系的各种单独方案。
这是我的两个主要问题:
结果应为: kudos = [(类别A,3),(类别B,2)
如果我已经可以远程使用某些东西了,我会提供它,但是我完全被卡住了。这就是为什么我什至开始怀疑将荣誉存储在单独的集合中的原因,但我觉得我比开始使用noSQL DB正确地走出正轨。
答案 0 :(得分:0)
假设您具有以下架构和数据:
import datetime as dt
from mongoengine import *
connect(host='mongodb://localhost:27017/testdb')
class Kudo(EmbeddedDocument):
date = DateTimeField(default=dt.datetime.utcnow)
category = StringField()
class User(Document):
name = StringField(required=True)
kudos = EmbeddedDocumentListField(Kudo)
superman = User(name='superman', kudos=[Kudo(category='A')]).save()
batman = User(name='batman', kudos = [Kudo(category='A'), Kudo(category='B')]).save()
这不是最有效的方法,但是您可以使用以下简单代码段进行分发:
import itertools
from collection import Counter
raw_kudos = User.objects.scalar('kudos')
categories_counter = Counter(k.category for k in itertools.chain.from_iterable(raw_kudos)) # raw_kudos is a list of list
print(categories_counter) # is a dict --> Counter({u'A': 1, u'B': 1})
如果您需要更高的性能,则需要使用aggregation pipeline