Flask_Mongoengine:不是mongoengine对象使用后总

问题描述:

使用时aggregate与mongoengine,它返回一个CommandCursor而不是mongoengine对象列表,这意味着mongonengine是不是真的被使用,Flask_Mongoengine:不是mongoengine对象使用后总

例如:如果一些文件没有按没有标题字段,会引发错误。我如何将结果转换为mongoengine对象?

class Post(Document): 
    title = StringField(max_length=120, required=True) 
    author = ReferenceField(User) 

Host.objects() 
# [<Post: Post object>, <Post: Post object>, ...] 

pipeline = [ 
    { 
     "$match": { 
      'types': type, 
     } 
    }, 
    { 
     "$project": { 
      "name": 1, 
      'brating': { 
       "$divide": [ 
        {"$add": ["$total_score", 60]}, 
        {"$add": ["$total_votes", 20]} 
       ] 
      } 
     } 
    }, 
    {"$sort": {"brating": -1}}, 
    {"$limit": 100} 

] 

Host.objects.aggregate(*pipeline) 
# <class 'pymongo.command_cursor.CommandCursor'> 

list(Host.objects.aggregate(*pipeline)) 
# <class 'list'> 
+0

这可能是值得发布一个新的问题,这就解释了为什么你需要在这里使用聚合。通常使用聚合管道来转换和合并多个文档,而不是仅检索它们。 –

aggregate函数只是底层pymongo function的快捷方式。

aggregate返回的文档可能涉及一些$group或其他阶段,这意味着它们与您的对象模型无关,所以mongoengine无法将它们转换为mongoengine对象。

对于您的管道,您正在使用$project阶段返回只有namebrating字段的新类型的文档。

Mongoengine不会能够这样做,你有两个选择,你想要的这里:

  • Store上Post文件brating领域。在帖子创建时以及0时初始化等级为0,当更新$total_score$total_votes时,还会更新等级。

  • 接受您找回非mongoengine对象,并相应地处理它们。光标将生成普通的python字典,然后您可以访问客户端代码中的字段post['name']或。

  • 使用正常.objects查询和排序的客户端。

的最后一步将东北角是一个问题,如果你有很多的文件,但对于少数尝试类似:

posts = Post.objects(types=type).only("name", "total_score", "total_votes") 
top_posts = sorted(list(posts),key=lambda p: (p.total_score+60)/(p.total_votes+20))[:100] 
+0

问题是我必须使用'aggregate'来处理一些复杂的查询mongoengine无法处理它,有没有办法同时使用它们? – Cl0udSt0ne

+0

为什么mongoengine不能处理查询?也许在问题中发布你的管道。 –

+0

我刚刚添加了管道代码,请看看它,以及如何用mongoengine的'.objects'表示法来做到这一点。 – Cl0udSt0ne