1 回答

TA贡献1802条经验 获得超10个赞
如果我直接在 MongoDB 中执行查询一切正常,但在 Go 中我得到一个空类别。我认为问题在于查找返回一个数组但我试图将它映射到一个对象上。
$lookup阶段确实返回一个数组,但如果这是您的问题,您可能会收到一个错误,例如cannot decode array into a Category. 它可能是由其他原因引起的,下面的答案将显示一个工作示例,希望也能帮助您解决问题。
这里有两种选择,具体取决于您的用例。首先是声明Category为数组,即
type Book struct {
ID primitive.ObjectID `bson:"_id"`
Name string `bson:"name"`
Category []*Category `bson:"category"`
}
其次,您可以利用$unwind阶段来删除阵列。例如:
collection := client.Database("go").Collection("book")
lookupStage := bson.D{{"$lookup", bson.D{
{"from", "category"},
{"localField", "category"},
{"foreignField", "_id"},
{"as", "category"}}}}
unwindStage := bson.D{{"$unwind", "$category"}}
pipeline := mongo.Pipeline{lookupStage, unwindStage}
cursor, err := collection.Aggregate(context.TODO(), pipeline)
defer cursor.Close(context.TODO())
if err != nil {
panic(err)
}
cursor.Next(context.TODO())
var book Book
err = cursor.Decode(&book)
if err != nil {
panic(err)
}
fmt.Println(book)
说了以上所有内容,根据您的用例,您应该重新考虑架构。假设图书类别不会经常更改,您可以将其嵌入Category到Book. 这将简化很多查询,因为图书类别可能是图书的重要信息。
- 1 回答
- 0 关注
- 134 浏览
添加回答
举报