gpt4 book ai didi

mongodb - 如何执行查找仅获取第一个元素

转载 作者:行者123 更新时间:2023-12-01 22:20:18 27 4
gpt4 key购买 nike

我有以下两个结构:

Category struct {
ID primitive.ObjectID `bson:"_id"`
Name string `bson:"name"`
}

Book struct {
ID primitive.ObjectID `bson:"_id"`
Name string `bson:"name"`
Category *Category `bson:"category"`
}
我想找到一本汇总其类别的书,然后执行此查询
// lookup stage
lookupStage := bson.D{{"$lookup", bson.D{
{"from", "category"},
{"localField", "category"},
{"foreignField", "_id"},
{"as", "category"}}}}
通过此查找,我将获取的类别文档放入书的类别字段中。
// match stage (cut for simplicity, it doesn't care)
var matchStage bson.D = ...

pipeline := mongo.Pipeline{
matchStage,
lookupStage,
}

cur, err := bookCollection.Aggregate(context.TODO(), pipeline)

cur.Decode(&book)
如果我直接在MongoDB中执行查询,则一切正常,但是在Go中,我得到的是空类别。我认为问题在于查找返回一个数组,但我试图将其映射到对象上。
所以问题是:如何获取由查找操作产生的数组的第一个元素并将其放置在book实例中?
我正在使用mongo官方驱动程序。

最佳答案

如果我直接在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。这将简化很多查询,因为书籍类别可能是书籍的重要信息。
有关模式设计的更多信息,请参见 Building With Patterns: A Summary

关于mongodb - 如何执行查找仅获取第一个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63942182/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com