关于python:使用mongoengine查询复杂的JSON模式

Querying a complex JSON Schema with mongoengine

我正在尝试使用flask和mongoengine构建一个Webapp,但是遇到以下问题。

假设有一个具有JSON结构的文档,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
"user": {
 "value":"username",
  [...]
},
"entities": [
  {
   "key":"foo",
   "value":"123"
  },
   "key":"bar",
   "value":"456"
  },
  [...]
]

1)
首先,我想从用户" username "获取整个文档,我尝试过:

1
userdata = models.User.objects(user__match = {"value":"username"})

但是这将返回一个空文档。我也尝试过这样的事情:

1
userdata = models.User.objects(user__contains ="username")

但是后来我得到了:
AttributeError: 'str' object has no attribute 'get'

我阅读了文档,然后偷偷摸摸,但发现没有任何帮助。

2)
当文档(最终)从数据库获得时,我需要从entities中捕获所有value以便在jinja2模板中显示该文档,但不知道如何进行管理。

这是模型的一部分:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Username(EmbeddedDocument):
    value = StringField(
        primary_key = True,
        unique = True)
    created = DateTimeField(
        require = True,
        default = datetime.utcnow())

class Entities(EmbeddedDocument):
    etype = StringField(
        require = True,
        choices = ENTITYTYPES)
    key = StringField(
        require = True,
        choices = ENTITIES)
    value = StringField(
        require = True)
    modiefied = DateTimeField(
        require = True,
        default = datetime.utcnow())

class User(Document):
    user = EmbeddedDocumentField(
        Username)
    entities = ListField(
        GenericEmbeddedDocumentField(Entities))

如@Paul所述,我尝试了一些查询:

1
userdata = models.User.objects.get(entities={"key":"foo"})

结果:AttributeError: 'dict' object has no attribute 'to_mongo'

1
userdata = models.User.objects(entities={"key":"foo"})

结果:AttributeError: 'dict' object has no attribute 'to_mongo'

1
userdata = models.User.objects(user__entities = {"key":"foo"})

结果:mongoengine.errors.InvalidQueryError: Cannot resolve field"user"

1
userdata = models.User.objects.get(entities={"key":"foo"})

结果:AttributeError: 'dict' object has no attribute 'to_mongo'

1
userdata = models.User.objects(__raw__={"key":"foo"})

结果:[]

1
userdata = models.User.objects(key='foo')

结果:mongoengine.errors.InvalidQueryError: Cannot resolve field"key"


在进一步搜索的同时,我遇到了这个问题和这个问题。

把他们放在一起带来了我的第一个问题的答案:
data = models.User.objects(__raw__ = { 'user.value': 'username' })

所以我从用户那里获得了数据。为了在jinja2中进行排序,我找到了Question和那个,所以我来到了这个模板:

1
2
3
4
5
6
{% for dict_item in data %}
  {% for item in dict_item['entities'] %}
    Key: {{item['key']}}
    Value: {{item['value']}}
  {% endfor %}
{% endfor %}

仅供参考:如果您需要在shell中打印mongoengine查询,请使用以下命令:

1
2
3
from bson import json_util
objects = models.User.objects.all()
json_util.dumps(objects._collection_obj.find(objects._query))

是的,模型User有一个字段User,而该字段是字典?
如果尝试此操作怎么办:

1
2
userdata = models.User.objects.get(user={"value":"username"}) # will return one
userdata = models.User.objects(user={"value":"username"})     # will return multiple

或者这个:

1
userdata = models.User.objects(user__user = {"value":"username"})