Mongodb “怎么做?”;分组方式;在mongoengine

Mongodb “怎么做?”;分组方式;在mongoengine,mongodb,pymongo,mongoengine,Mongodb,Pymongo,Mongoengine,假设我的模式是这样的: class User(Document): username = StringField() password = StringField() category = StringField() 假设我们有这些现有类别:“复仇者”、“正义联盟”、“恶棍”,我想对User.objects.all()执行一个“分组查询”,这样我就可以得到如下结果: [ [<User: IronMan object>, <User: Thor object>

假设我的模式是这样的:

class User(Document):
  username = StringField()
  password = StringField()
  category = StringField()
假设我们有这些现有类别:
“复仇者”、“正义联盟”、“恶棍”
,我想对
User.objects.all()
执行一个
“分组查询”
,这样我就可以得到如下结果:

[
 [<User: IronMan object>, <User: Thor object>, <User: Hulk object>], 
 [<User: Superman object>,<User: Batman object>], 
 [<User: Ultron object>, <User: Joker object>, <User: LexLuthor object>]
]
[
[, ], 
[,], 
[, ]
]
或者更好:

{
 "avengers": [<User: IronMan object>, <User: Thor object>, <User: Hulk object>], 
 "justice-leaguers": [<User: Superman object>,<User: Batman object>], 
 "villains": [<User: Ultron object>, <User: Joker object>, <User: LexLuthor object>]
}
{
“复仇者”:[,],
“司法联盟”:[,],
“恶棍”:[,]
}
我查阅了MongoEngine的文档,还没有找到任何有用的东西。谢谢大家

使用,您只需按类别对文档进行
$group

db.User.aggregate([
  {
    $group: { _id: "$category", username: { $push: "$username" }}
  }
])
使用聚合函数,您将构建一个包含共享同一类别的所有用户名的数组

给定您的示例数据:

> db.User.find({},{category:1,username:1,_id:0})
{ "category" : "avengers", "username" : "IronMan" }
{ "category" : "avengers", "username" : "Thor" }
{ "category" : "avengers", "username" : "Hulk" }
{ "category" : "justice-leagers", "username" : "Superman" }
{ "category" : "justice-leagers", "username" : "Batman" }
{ "category" : "villains", "username" : "Ultron" }
{ "category" : "villains", "username" : "Joker" }
{ "category" : "villains", "username" : "LexLuthor" }
这将产生:

{ "_id" : "villains", "username" : [ "Ultron", "Joker", "LexLuthor" ] }
{ "_id" : "justice-leagers", "username" : [ "Superman", "Batman" ] }
{ "_id" : "avengers", "username" : [ "IronMan", "Thor", "Hulk" ] }

由于OP要求使用mongoengine(这正是我所需要的),下面是一个使用mongoengine的示例:

categories = User.objects.aggregate([{
    '$group': { '_id': '$category', 'username': { '$push': '$username' }}
}])
这将返回pymongo命令游标迭代器

print list(categories)
将返回:

[{ "_id": "villains", "username": ["Ultron", "Joker", "LexLuthor"]},
 { "_id": "justice-leagers", "username": ["Superman", "Batman"]},
 { "_id": "avengers", "username": ["IronMan", "Thor", "Hulk"]}]

有没有可能用Mongoengine来实现这一点?我很可能在我的python代码中而不是在mongo shell中这样做。再次感谢@benjaminz我没有访问Mongoengine的权限(而且从未使用过它),但它似乎具有所需的API:请查看以下答案:在Mongoengine中使用“group by”。是否可以在这些查询中添加where条件?@soleschong这是正确的语法。这是一个python字典列表。它不再起作用的原因可能是mongoengine的总量发生了变化。要使其正常工作,只需关闭列表:
User.objects.aggregate({…})
,而不是
([{…}])
@w请参见11月21日的编辑。答案已更正语法错误。@soleschong好的,感谢您澄清此问题。尽管如此,有关列表的评论目前仍然适用。@现实,谢谢您的回答!当您有多个类别要分组时,是否介意使用示例的语法对其进行更新。这是在CLI
$group:{u id:{one:$one,two:$two}
中工作的,但是代码说“不能对对象进行编码”。