我对这段代码有问题,有人可以帮忙解决吗?我在“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 个集合中的名称字段,并将结果与价格写入新集合。我猜这在管道聚合中会出错。