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") |
但是后来我得到了:
我阅读了文档,然后偷偷摸摸,但发现没有任何帮助。
2)
当文档(最终)从数据库获得时,我需要从
这是模型的一部分:
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"}) |
结果:
1 | userdata = models.User.objects(entities={"key":"foo"}) |
结果:
1 | userdata = models.User.objects(user__entities = {"key":"foo"}) |
结果:
1 | userdata = models.User.objects.get(entities={"key":"foo"}) |
结果:
1 | userdata = models.User.objects(__raw__={"key":"foo"}) |
结果:
1 | userdata = models.User.objects(key='foo') |
结果:
在进一步搜索的同时,我遇到了这个问题和这个问题。
把他们放在一起带来了我的第一个问题的答案:
所以我从用户那里获得了数据。为了在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)) |
是的,模型
如果尝试此操作怎么办:
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"}) |