当前位置: 首页 > 面试题库 >

仅使用Mongo和Golang返回查找的文档

姚凯歌
2023-03-14
问题内容

我有这两个模型:

// 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时 仅返回一个 事件, 而不必使用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



 类似资料:
  • 问题内容: 经过15年的VB6和MySql之后,我对node和mongo还是陌生的。我确定这不是我的最终程序要使用的东西,但是我需要对如何在另一个模块中调用函数并返回结果有一个基本的了解。 我希望模块具有打开数据库,在集合中查找并返回结果的功能。我可能还想在该模块中为其他集合添加更多功能。现在,我需要它尽可能简单,以后可以添加错误处理程序等。我花了几天的时间在函数周围尝试不同的方法,module.

  • 以前也有人问过这个问题,但没有一个答案是我能理解的。 使用Meteor,我将一个名为Scrdata的集合拉入Select/Option。这很好。在选项中,我正在插入该文档的_id。一切都很好。 我正在尝试做一件非常简单的事情,通过id找到一个文档: 控制台中的结果是: 我的目标是,在选择块发生更改时,在该页面上填充表单。但是,按_id查找不起作用。 我很感谢任何见解和指导。谢谢你。

  • 问题内容: 如何获取使用SQL Server的SQL查询返回的列数? 例如,如果我有如下查询: 它应该返回表A1中的总列数+表A2中的总列数。但是查询可能会更复杂。 问题答案: 这是一种方法: 您可以通过创建视图来执行类似的操作。

  • 我想写一个excel公式,它可以让我从表2中找到表1的一列值,然后返回表2中的单元格引用, 谢谢,

  • 问题内容: 此代码仅返回一行,但应返回2行。我在phpMyAdmin中尝试了SQL,它完美返回了2行。我在这里做错了什么? 顺便说一句,上面的代码通过以下脚本将程序移至profile.php: 问题答案: 您需要遍历结果(如TheSmose所述) 并且 您需要将结果数组发送到模板而不是。 改变这个 对此 如果您不只是想要模板中的内容(并且您不需要PHP> = 5.3 ),那么您将需要在循环内构建自

  • 问题内容: 我创建了一个自定义错误类型来包装错误,以便更轻松地在Golang中进行调试。当有打印错误时它可以工作,但是现在引起了恐慌。 演示版 当我调用一个函数时,它不会返回错误,我仍然应该能够包装该错误。 预期的行为是,如果错误为nil,则应该简单地忽略它,不幸的是,它会做相反的事情。 我希望它能打印出来。而是即使错误为nil也会打印。 问题答案: 正在将err变量与nil进行比较,但实际上它是