mongoengine过滤查询检索嵌入文档

时间:2016-05-03 11:07:11

标签: mongodb mongodb-query pymongo mongoengine flask-mongoengine

import mongoengine

class MyLog(mongoengine.EmbeddedDocument):
    text = mongoengine.StringField()

class Server(mongoengine.DynamicDocument):
    name = mongoengine.StringField()
    status = mongoengine.StringField()
    text_list = mongoengine.ListField(mongoengine.EmbeddedDocumentField(MyLog))
默认情况下,

Server.objects.all() queryset不包含text_list字段的值。 我要这样做 - (为查询集中的每个对象获取text_list字段的值。

for s in Server.objects.all():
    print s.text_list

在我的情况/场景中,我不能这样做,我的意思是我必须在查询集本身中获取所有数据(或者换句话说,我需要一个查询集,它将为我提供所有嵌套的详细信息不使用obj.text_list

例如。

进一步在mongo shell中 - db.server.find()包含所有嵌套的嵌入文档。

{ 
  '_id': ObjectId("272742942qbe5451b4f4b9e7"),
  'name':'nm',
  'status': 'st',
  'text_list': [
       {# here it's including embedded model's info too, no need to make extra query, looking for similar query in mongoengine orm
         'text': 'done'
      }
  ]
}

我们如何使用orm或raw_query在mongoengine中执行此操作。

我可以使用to_json()方法

在mongoengine orm中解决这个问题

json.loads(queryset.to_json())

Server.objects.all().to_json()返回包含嵌入式模型信息的结果,但在数百万个文档中使用分页时效率不高,我的意思是在这种情况下mongo会尝试将所有对象转换为to_json。

1 个答案:

答案 0 :(得分:0)

如果您想使用flask-mongoengine对查询集的结果进行分页,则只需使用paginate的{​​{1}}方法:

Queryset

Here您可以找到有关模板部分和其他可用功能的更多信息。