mongodb - 仅返回使用 Mongo 和 Golang 查找的文档
问题描述
我有这两个模型:
// 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应该可以帮助我做我想做的事情,但是我没有找到如何将嵌套文档转换为最终文档。
解决方案
您可以使用$unwind
将event
数组字段“转换”为单个嵌入文档,然后$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
。
推荐阅读
- javascript - 我如何从阵列中获得下一次祈祷时间?
- firebase - 如何下载已在 firebase 免费域中上传的 Firebase 项目?
- python - 为什么谷歌镜头无法识别使用 PIL 库制作的图像上的 pyqrcode 制作的 QR?
- mysql - SQL 查询、JOIN 和 CASE 语句给出错误
- mysql - 使用 WHERE 子句时 MySQL 查询不显示所有数据
- amazon-web-services - regexp_count 返回不正确的计数(Redshift)
- python-3.x - Fastai v2 IndexError:目标 2 超出范围
- python - 一个接一个地运行许多python脚本
- android - 仅在前台应用:如何避免“未声明后台位置访问”
- android - 如何以拆分模式打开另一个应用程序 [android]