Golang中的聚合Mongodb

时间:2021-03-28 06:05:18

标签: mongodb go aggregation-framework mongo-go mongo-go-driver

我对这段代码有问题,有人可以帮忙解决吗?我在“Robo 3T”中运行代码结果很好,但是在 golang 中运行代码时没有任何反应。

    package main

import (
  "context"
    "fmt"
    "log"

    "go.mongodb.org/mongo-driver/bson"
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"

)

type StrMade struct {

    ID               bson.RawValue        `bson:"_id,omitempty"`
    NameMade         string               `bson:"NameM,omitempty"`
    MadeinC          string               `bson:"Madein,omitempty"`
    StructPrice      []StrPric         
}

type StrPric struct {

  IdP             bson.RawValue        `bson:"_id,omitempty"`
  NamePrice       string               `bson:"NameP,omitempty"`
  PriceP          int32                `bson:"Price,omitempty"`
}

func main() {

    ctx := context.Background()
    clientOptions := options.Client().ApplyURI("mongodb://127.0.0.1:27017")
    client, err := mongo.Connect(ctx, clientOptions)
    if err != nil {
        log.Fatal("Error while Connect",err)
    }
    err = client.Ping(ctx, nil)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println("Connected to MongoDB!")

//Using Database and Collections

    db := client.Database("Cars")
    col := db.Collection("NameMadein")
    colb := db.Collection("NamePrice")
    colNew := db.Collection("Ncol")

//Main code where searching and sorting info

searching := bson.M{

    {
        "$lookup": bson.M{
            "from": "colb",
            "let": bson.M{ "nameMl": "$NameM" },
            "pipeline": []bson.M{
                "$match": bson.M{
                    "$expr": bson.M{
                       "$and": {
                            bson.M{ "$eq": []string{ "$NameP", "$$nameMl" } },
                        },
                    },
                },
            },
            "as": "final",
        },
    },
},

replaceR := bson.M{
    "$replaceRoot": bson.M{ 
     "newRoot": []bson.M{ 
   "$mergeObjects": [[]bson.M{ 
   "$arrayElemAt": ["$final", 0]}, 
   "$$ROOT"]} 
 }
  },

matchi := bson.M{
"$match": bson.M{
"Price": bson.M{
"$exists": true} 
}
},

groupa := bson.M{
        "$group": bson.M{
            "_id": bson.M{ 
"Made": "$Madein", "Name": "$NameP", "USD": "$Price" 
}
  }
    },
projectT := bson.M{
"$project": bson.M{
"_id": 1, "NameP": 1, "Price": 1, "Madein": 1
}
},

mergeE := bson.M{
"$merge": bson.M{
"into": "colNew"
}
},

//listing of result code
cursor, err := col.Aggregate(ctx, mongo.Pipeline{searching, replaceR, matchi, groupa, projectT, mergeE})
if err != nil {
  log.Fatal(err)
}

//Loop for info

var results []*StrMade

for cursor.Next(context.TODO()) {
  var elem StrMade
  err  := cursor.Decode(&elem)
  if err != nil {
    log.Fatal(err)
  }
  results = append(results, &elem)
}

if err := cursor.Err(); err != nil {
  log.Fatal(err)
}

cursor.Close(context.TODO())

fmt.Println("%+v\n", results)

}
}

结果应该比较 2 个集合中的名称字段,并将结果与​​价格写入新集合。我猜这在管道聚合中会出错。

0 个答案:

没有答案
相关问题