Представление 1 записи (сообщество):
{
"_id" : ObjectId("538a4734d6194c0e98000001"),
"name" : "Darko",
"description" : "Darko",
"subdomain" : "darko",
"domain" : "forum.dev",
"created" : ISODate("2014-05-31T21:18:44.764Z"),
"category" : "Art and Culture",
"owner" : "53887456d6194c0f5b000001",
"members" : [
"53887456d6194c0f5b000001"
]
}
и тип Go
Community struct {
Id bson.ObjectId `bson:"_id,omitempty" json:"id"`
Name string `json:"name"`
Description string `bson:",omitempty" json:"description"`
Subdomain string `bson:",omitempty" json:"subdomain"`
Domain string `json:"domain"`
Created time.Time `json:"created"`
Category string `json:"category"`
Owner string `json:"owner"`
Banned []string `bson:",omitempty" json:"banned"`
Members []string `json:"members"`
Moderators []string `bson:",omitempty" json:"moderators"`
Admins []string `bson:",omitempty" json:"admins"`
Logo string `bson:",omitempty" json:"logo"`
Stylesheets []string `bson:",omitempty" json:"stylesheets"`
Javascripts []string `bson:",omitempty" json:"javascripts"`
}
Хорошо, теперь я хотел бы получить список всех сообществ Category
Art and Culture
и упорядочить по количеству участников, также известных как members.length
в js или len(Community.Members)
в Go.
что-то вроде SELECT * FROM communities ORDER BY COUNT(members) WHERE category = 'Art and Culture'
У меня есть пользовательский тип, который нужно заполнить или рассортировать.
CommunityDirectory struct {
Id bson.ObjectId `bson:"_id,omitempty" json:"id"`
Name string `json:"name"`
Description string `bson:",omitempty" json:"description"`
Subdomain string `bson:",omitempty" json:"subdomain"`
Domain string `json:"domain"`
Created time.Time `json:"created"`
Category string `json:"category"`
Logo string `bson:",omitempty" json:"logo"`
Membercount int64 `bson:"membercount" json:"membercount"`
}
Что у меня есть до сих пор
func (ctx *CommunityContext) Directory() {
pipe := ccommunity.Pipe([]bson.M{bson.M{"membercount": bson.M{"$size": "members"}}})
iter := pipe.Iter()
result := CommunityDirectory{}
results := []CommunityDirectory{}
for {
if iter.Next(&result) {
results = append(results, result)
fmt.Println(result)
} else {
break
}
}
ctx.JSON(results)
}
но это не работает, потому что
db.communities.aggregate(
[
{"membercount": {$size:"members"}}
]
)
Error("Printing Stack Trace")@:0
()@src/mongo/shell/utils.js:37
([object Array])@src/mongo/shell/collection.js:866
@(shell):3
uncaught exception: aggregate failed: {
"errmsg" : "exception: Unrecognized pipeline stage name: 'membercount'",
"code" : 16436,
"ok" : 0
}
Таким образом, он должен найти все, упорядочить по количеству участников и назначить новое «виртуальное» поле «Количество участников», но только категории «Искусство и культура».
Я нахожу MongoDB довольно сложной в этом отношении.
Как выглядит запрос mongodb?
Как это выглядит в Go/mgo?