以下代码示例演示了如何通过在MongoDB中使用$lookup和嵌套查询从多个集合中获取数据:
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 User struct {
ID string `bson:"_id,omitempty"`
Name string `bson:"name,omitempty"`
Gender string `bson:"gender,omitempty"`
City string `bson:"city,omitempty"`
Country string `bson:"country,omitempty"`
Phone string `bson:"phone,omitempty"`
Age int32 `bson:"age,omitempty"`
Hobbies []string `bson:"hobbies,omitempty"`
}
type Order struct {
ID string `bson:"_id,omitempty"`
UserID string `bson:"userId,omitempty"`
OrderDate string `bson:"orderDate,omitempty"`
TotalAmount float64 `bson:"totalAmount,omitempty"`
}
func main(){
clientOptions := options.Client().ApplyURI("mongodb://localhost:27017")
ctx := context.Background()
client, err := mongo.Connect(ctx, clientOptions)
if err != nil {
log.Fatal(err)
}
db := client.Database("mydb")
usersColl := db.Collection("users")
ordersColl := db.Collection("orders")
pipeline := bson.M{
"$lookup": bson.M{
"from": "orders",
"localField": "_id",
"foreignField": "userId",
"as": "orders",
},
}
cursor, err := usersColl.Aggregate(ctx, mongo.Pipeline{pipeline})
if err != nil {
log.Fatal(err)
}
defer cursor.Close(ctx)
var users []User
if err = cursor.All(ctx, &users); err != nil {
log.Fatal(err)
}
fmt.Println(users)
}
在上面的代码示例中,我们首先连接到MongoDB数据库。然后,我们获取对用户和订单集合的引用,并使用$lookup和嵌套查询从每个订单的用户ID获取相应的用户记录。最后,我们将用户记录打印到控制台。