aggregate rewrite and set view

This commit is contained in:
Florian Baumann 2022-01-06 13:06:19 +01:00
parent b63f8cc2ba
commit 305f84f0a9
2 changed files with 33 additions and 19 deletions

View File

@ -86,7 +86,7 @@ func Cards() {
client := storage_connect()
coll := &Collection{client.Database("serra").Collection("cards")}
sort := bson.D{{"collectornumber", 1}}
sort := bson.D{{"name", 1}}
filter := bson.D{{}}
cards, _ := coll.storage_find(filter, sort)
@ -110,7 +110,7 @@ func Sets() {
}},
}
sets, _ := coll.storage_aggregate(groupStage)
sets, _ := coll.storage_aggregate(bson.D{{"$match", bson.D{{}}}}, groupStage)
for _, set := range sets {
fmt.Printf("* %s (%.2f Eur) %.0f\n", set["_id"], set["value"], set["count"])
}
@ -124,29 +124,43 @@ func ShowSet(setname string) error {
client := storage_connect()
coll := &Collection{client.Database("serra").Collection("cards")}
cards, err := coll.storage_find(bson.D{{"set", setname}}, bson.D{{"collectornumber", 1}})
// fetch all cards in set
cards, err := coll.storage_find(bson.D{{"set", setname}}, bson.D{{"prices.eur", -1}})
if (err != nil) || len(cards) == 0 {
LogMessage(fmt.Sprintf("Error: Set %s not found or no card in your collection.", setname), "red")
return err
}
// print
var eur_sum float64
var card_count int64
for _, card := range cards {
fmt.Printf("%dx %d %s %.2f\n", card.SerraCount, card.CollectorNumber, card.Name, card.Prices.Eur)
eur_sum = eur_sum + card.Prices.Eur*float64(card.SerraCount)
card_count = card_count + card.SerraCount
}
// fetch set informations
setcoll := &Collection{client.Database("serra").Collection("sets")}
sets, _ := setcoll.storage_find_set(bson.D{{"code", setname}}, bson.D{{"_id", 1}})
LogMessage(fmt.Sprintf("\n%s\n", sets[0].Name), "green")
// set values
matchStage := bson.D{
{"$match", bson.D{
{"set", "mmq"},
}},
}
groupStage := bson.D{
{"$group", bson.D{
{"_id", "$setname"},
{"value", bson.D{{"$sum", bson.D{{"$multiply", bson.A{"$prices.eur", "$serra_count"}}}}}},
{"count", bson.D{{"$sum", bson.D{{"$multiply", bson.A{1.0, "$serra_count"}}}}}},
}},
}
stats, _ := coll.storage_aggregate(matchStage, groupStage)
LogMessage(fmt.Sprintf("%s", sets[0].Name), "green")
LogMessage(fmt.Sprintf("Set Cards: %d/%d", len(cards), sets[0].CardCount), "normal")
LogMessage(fmt.Sprintf("Total Cards: %d", card_count), "normal")
LogMessage(fmt.Sprintf("Value: %.2f Eur", eur_sum), "normal")
LogMessage(fmt.Sprintf("Total Cards: %.0f", stats[0]["count"]), "normal")
LogMessage(fmt.Sprintf("Value: %.2f", stats[0]["value"]), "normal")
LogMessage(fmt.Sprintf("Released: %s", sets[0].ReleasedAt), "normal")
LogMessage(fmt.Sprintf("\nMost valuable cards"), "purple")
for i := 0; i < 10; i++ {
card := cards[i]
fmt.Printf("%dx %s (%s/%d) %.2f EUR\n", card.SerraCount, card.Name, sets[0].Code, card.CollectorNumber, card.Prices.Eur)
}
storage_disconnect(client)
return nil
@ -212,7 +226,7 @@ func Stats() {
{"count", bson.D{{"$sum", 1}}},
}}}
sets, _ := coll.storage_aggregate(groupStage)
sets, _ := coll.storage_aggregate(bson.D{{"$match", bson.D{{}}}}, groupStage)
for _, set := range sets {
// TODO fix primitiveA Problem with loop and reflect
fmt.Printf("* %s %d\n", set["_id"], set["count"])

View File

@ -99,13 +99,13 @@ func (coll Collection) storage_remove(filter bson.M) error {
}
func (coll Collection) storage_aggregate(groupstage bson.D) ([]primitive.M, error) {
func (coll Collection) storage_aggregate(matchstage, groupstage bson.D) ([]primitive.M, error) {
// db.cards.aggregate([ {$group: { _id: "$setname", sum: { $sum: "$prices.eur"}}}])
opts := options.Aggregate().SetMaxTime(2 * time.Second)
cursor, err := coll.Aggregate(
context.TODO(),
mongo.Pipeline{groupstage},
mongo.Pipeline{matchstage, groupstage},
opts)
if err != nil {
log.Fatal(err)