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}
中工作的,但是代码说“不能对对象进行编码”。