如何在mongoengine中"分组"

ben*_*inz 6 mongodb pymongo mongoengine

假设我的Schema看起来像这样:

class User(Document):
  username = StringField()
  password = StringField()
  category = StringField()
Run Code Online (Sandbox Code Playgroud)

想象一下,我们有这些现有的类别:"avengers", "justice-leaguers", "villains",我想执行一个"group by"查询,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>]
]
Run Code Online (Sandbox Code Playgroud)

或者更好的是:

{
 "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>]
}
Run Code Online (Sandbox Code Playgroud)

我查看了MongoEngine的文档,但还没有找到任何有用的信息.多谢你们!

Rea*_*tic 15

由于OP要求mongoengine(这就是我需要的),这里有一个使用mongoengine的例子:

categories = User.objects.aggregate([{
    '$group': { '_id': '$category', 'username': { '$push': '$username' }}
}])
Run Code Online (Sandbox Code Playgroud)

这将返回一个pymongo命令游标迭代器.

print list(categories)
Run Code Online (Sandbox Code Playgroud)

将返回:

[{ "_id": "villains", "username": ["Ultron", "Joker", "LexLuthor"]},
 { "_id": "justice-leagers", "username": ["Superman", "Batman"]},
 { "_id": "avengers", "username": ["IronMan", "Thor", "Hulk"]}]
Run Code Online (Sandbox Code Playgroud)

  • @SolessChong这是正确的语法。这是字典的python列表。它不再起作用的原因可能是mongoengine的总量发生了变化。要使其正常工作,只需关闭列表:`User.objects.aggregate({...})`而不是`([[......]))。 (2认同)

Syl*_*oux 4

使用聚合框架,您只需要按$group类别记录文档:

db.User.aggregate([
  {
    $group: { _id: "$category", username: { $push: "$username" }}
  }
])
Run Code Online (Sandbox Code Playgroud)

使用$push聚合函数,您将构建一个包含共享同一类别的所有用户名的数组。

给你样本数据:

> 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" }
Run Code Online (Sandbox Code Playgroud)

这将产生:

{ "_id" : "villains", "username" : [ "Ultron", "Joker", "LexLuthor" ] }
{ "_id" : "justice-leagers", "username" : [ "Superman", "Batman" ] }
{ "_id" : "avengers", "username" : [ "IronMan", "Thor", "Hulk" ] }
Run Code Online (Sandbox Code Playgroud)

  • 有没有可能使用 Mongoengine 来完成此操作?我很可能在 python 代码而不是 mongo shell 中执行此操作。再次感谢! (3认同)