【问题标题】:mongoengine filter query retrieve embedded documentsmongoengine过滤器查询检索嵌入文档
【发布时间】:2016-08-28 09:32:25
【问题描述】:
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() 查询集默认不包含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'
      }
  ]
}

我们如何在 mongoengine 中使用 orm 或 raw_query 做到这一点。

我可以通过to_json()方法在mongoengine orm中解决这个问题

json.loads(queryset.to_json())

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

【问题讨论】:

  • 请澄清问题。首先你说不包含结果然后你说你可以通过实例属性访问结果。
  • @lesingerouge:更新了问题详情。
  • 就像@lesingerouge 所说,目前还不清楚你想要什么。查询集确实返回了文档,其中包含您可以作为实例属性访问的嵌入字段。还有什么?

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


【解决方案1】:

如果你想使用flask-mongoengine对查询集的结果进行分页,你应该简单地使用Querysetpaginate方法:

# Paginate through todo
def view_todos(page=1):
    paginated_todos = Todo.objects.paginate(page=page, per_page=10)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-02
    • 2022-10-21
    • 1970-01-01
    • 1970-01-01
    • 2016-09-04
    相关资源
    最近更新 更多