使用mongoengine

时间:2019-07-05 07:42:47

标签: python mongodb flask mongoengine

我有一个双重问题,这使我无法继续前进一段时间。我已经阅读了很多文章,多次检查了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集合创建嵌套文档将是更好的解决方案。否则,您仍在创建与他人有联系的各种单独方案。

这是我的两个主要问题:

  1. 我是否纠正我的体系结构对应如何实现mongoengine的看法正确?
  2. 如何获取每个类别的工藤的列表(实际上是字典)?所以我想查询并获取类别-计数

结果应为: kudos = [(类别A,3),(类别B,2)

如果我已经可以远程使用某些东西了,我会提供它,但是我完全被卡住了。这就是为什么我什至开始怀疑将荣誉存储在单独的集合中的原因,但我觉得我比开始使用noSQL DB正确地走出正轨。

1 个答案:

答案 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