gpt4 book ai didi

mongodb - 只用 Mongodb 和 Golang 返回查找的文档

转载 作者:IT王子 更新时间:2023-10-29 02:09:40 24 4
gpt4 key购买 nike

我有这两个模型:

// EventBoost describes the model of a EventBoost
type EventBoost struct {
ID string `bson:"_id" json:"_id" valid:"alphanum,printableascii"`
Name string `bson:"name" json:"name"`
Description string `bson:"description" json:"description"`
Level string `bson:"level" json:"level"`
EventID string `bson:"_event_id" json:"_event_id" valid:"alphanum,printableascii"`
StartDate time.Time `bson:"start_date" json:"start_date"`
EndDate time.Time `bson:"end_date" json:"end_date"`
IsPublished bool `bson:"is_published" json:"is_published"`
CreatedBy string `bson:"created_by" json:"created_by"`
CreatedAt time.Time `bson:"created_at" json:"created_at"`
ModifiedAt time.Time `bson:"modified_at" json:"modified_at"`
}

// Event describes the model of an Event
type Event struct {
ID string `bson:"_id" json:"_id" valid:"alphanum,printableascii"`
OldID string `bson:"old_id" json:"old_id" valid:"alphanum,printableascii"`
ParentID string `bson:"_parent_id" json:"_parent_id" valid:"alphanum,printableascii"`
Name string `bson:"name" json:"name"`
Content string `bson:"content" json:"content"`
Slug string `bson:"slug" json:"slug"`
LocationID string `bson:"_location_id" json:"_location_id"`
Price string `bson:"price" json:"price"`
Categories []string `bson:"categories" json:"categories"`
Tags []string `bson:"tags" json:"tags"`
Organisers []string `bson:"organisers" json:"organisers"`
Artists []string `bson:"artists" json:"artists"`
Image string `bson:"image" json:"image"`
IsPublished bool `bson:"is_published" json:"is_published"`
IsProposed bool `bson:"is_proposed" json:"is_proposed"`
CreatedBy string `bson:"created_by" json:"created_by"`
CreatedAt time.Time `bson:"created_at" json:"created_at"`
ModifiedAt time.Time `bson:"modified_at" json:"modified_at"`
}

我希望在查找 EventBoost 时仅返回一个 Event,而不必使用 Golang 逻辑执行清理。因为实际上,返回的文档有一个名为 event 的属性。我直接想要一个事件文档。

这是我的方法,需要返回 []*models.Event :

// Boosted returns the boosted events
func (dao *eventBoostDAO) Boosted() ([]*models.Event, error) {
// Clone the session
session := dao.session.Clone()
defer session.Close()

// Get the time
now := time.Now()

// Create the pipe
pipe := session.DB(shared.DatabaseNamespace).C(dao.collection).Pipe([]bson.M{
{
"$match": bson.M{
"is_published": true, // Boost is active
"start_date": bson.M{"$lt": now}, // now is between start and end
"end_date": bson.M{"$gt": now}, // now is between start and end
},
},
{
"$lookup": bson.M{
"from": "events",
"localField": "_event_id",
"foreignField": "_id",
"as": "event",
},
},
})

var result []*models.Event
err := pipe.All(&result)
if err != nil {
return nil, err
}

return result, nil
}

查看 Mongo 文档,我发现 $project 应该可以帮助我做我想做的事,但我没有找到如何将嵌套文档转换为最终文档。

最佳答案

您可以使用 $unwindevent 数组字段“转换”为单个嵌入式文档,然后 $replaceRoot将此 event 字段“提升”为新的“根”:

pipe := session.DB(shared.DatabaseNamespace).C(dao.collection).Pipe([]bson.M{
{
"$match": bson.M{
"is_published": true, // Boost is active
"start_date": bson.M{"$lt": now}, // now is between start and end
"end_date": bson.M{"$gt": now}, // now is between start and end
},
},
{
"$lookup": bson.M{
"from": "events",
"localField": "_event_id",
"foreignField": "_id",
"as": "event",
},
},
{"$unwind": "$event"},
{"$replaceRoot": bson.M{ "newRoot": "$event" }},
})

如果给定的 EventBoost 有多个事件,此解决方案可以正确处理。

关于mongodb - 只用 Mongodb 和 Golang 返回查找的文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50944814/

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