2015-05-12 25 views
5

yılında "gruplama" yapmak için şöyle:nasıl Şema görünüyor varsayalım mongoengine

class User(Document): 
    username = StringField() 
    password = StringField() 
    category = StringField() 

düşünün biz bu mevcut kategorileri vardır: "avengers", "justice-leaguers", "villains" ve ben almak böylece User.objects.all() için "group by" sorgusu gerçekleştirmek istediğiniz daha iyisi

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

Veya: böyle bir şey

{ 
"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'ın belgelerine baktım ve henüz faydalı bir şey bulamadım. Teşekkürler beyler!

cevap

2

aggregation framework kullanarak, sadece kategoriye göre $group belgeler gerekir:

db.User.aggregate([ 
    { 
    $group: { _id: "$category", username: { $push: "$username" }} 
    } 
]) 

$push toplama işlevini kullanarak, aynı kategoriyi paylaşan tüm adınızı içeren bir dizi inşa edecek.

Verilen örnek veriler:

> 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" } 

Bu üretecek:

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

bu Mongoengine kullanılarak yapılabilir şansın var mı? Bunu mongo kabuğu yerine python kodumda yapmam olası. Tekrar teşekkürler! – benjaminz

+0

@benjaminz Mongoengine'ye erişimim yok (ve hiç kullanmadım), ancak gerekli API'ye sahip görünüyor: [mongoengine.queryset.QuerySet.aggregate (* pipeline, ** kwargs)] (http: // docs.mongoengine.org/en/latest/apireference.html#mongoengine.queryset.QuerySet.aggregate) –

+0

'Bu bağlantıya bir göz atın:' [Link] (http://stackoverflow.com/a/24420848/1882331) ' mongoengine'de grup. – Yahya

9

mongoengine istedi OP (ve gerekeni şu) bu yana burada bu kullanarak mongoengine bir örnektir:

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

Bu, bir pymongo komut imleci yineleyici döndürecektir.

print list(categories) 

döndürür:

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

Çalışmıyor. Hiç python sözdizimi değil. – SolessChong

+0

@SolessChong doğru sözdizimi. Sözlüklerin bir python listesidir. Artık çalışmadığı sebep, muhtemelen mongoengine'in toplamında bir değişikliktir. Çalıştırmak için sadece listeyi kapatınız: '([{...}])' yerine User.objects.aggregate ({...}) '. – Wtower

+0

@Wtower 21 Kasım'daki düzenlemeye bakın. Yanıt, sözdizimi hatası verdi. – SolessChong