我有下面的结构。我使用 Golang 1.9.2 。
// EventBoost describes the model of a EventBoost
type EventBoost struct {
ID string `bson:"_id" json:"_id" valid:"alphanum,printableascii"`
CampaignID string `bson:"_campaign_id" json:"_campaign_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"`
}
// LocationBoost describes the model of a LocationBoost
type LocationBoost struct {
ID string `bson:"_id" json:"_id" valid:"alphanum,printableascii"`
CampaignID string `bson:"_campaign_id" json:"_campaign_id" valid:"alphanum,printableascii"`
Name string `bson:"name" json:"name"`
Description string `bson:"description" json:"description"`
Level string `bson:"level" json:"level"`
LocationID string `bson:"_location_id" json:"_location_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"`
}
// Campaign describes the model of a Campaign
type Campaign struct {
ID string `bson:"_id" json:"_id" valid:"alphanum,printableascii"`
Name string `bson:"name" json:"name"`
Description string `bson:"description" json:"description"`
EventBoostIDs []string `bson:"event_boost_ids" json:"event_boost_ids"`
LocationBoostIDs []string `bson:"location_boost_ids" json:"location_boost_ids"`
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"`
}
一个 活动 (了解营销活动)是由 事件 或 地点 可以与(基本或溢价)的水平而提高。广告活动有开始日期和结束日期,推广活动也是如此。
函数GetEventLevel
必须返回给定事件的级别。
// GetEventLevel of an event
func (dao *campaignDAO) GetEventLevel(eventID string) (string, error) {
}
如果事件在 有效的广告系列中 被增强(isPublished
is true
),并且 增强被激活 (isPublished
is
true
)并且 现在日期在boost的开始日期和结束日期之间 ,则我的Event被 增强
,因此该函数返回级别(基本或高级)。否则,它返回"standard"
。
我的问题是: 我可以完全通过Mongo做到这一点吗? 还是我需要使用Golang在DAO中执行一些逻辑?
如果我希望Mongo能够做到这一点,我不知道该怎么做。据我了解,我首先需要查找事件和活动的位置,然后在其中搜索日期,但是。
这样做 最
(和最困难的部分),你想要可以很容易地在MongoDB中做什么。返回“基本”,“高级”或“标准”的最后一步很可能也可以完成,但是我认为这不值得麻烦,因为在Go中这很琐碎。
在MongoDB中,请使用Aggregation框架。可mgo
通过Collection.Pipe()
方法在包装中找到。您必须向其传递一个切片,每个元素对应一个聚合阶段。
回到您的示例。您的GetEventLevel()
方法可以这样实现:
func (dao *campaignDAO) GetEventLevel(eventID string) (string, error) {
c := sess.DB("").C("eventboosts") // sess represents a MongoDB Session
now := time.Now()
pipe := c.Pipe([]bson.M{
{
"$match": bson.M{
"_event_id": eventID, // Boost for the specific event
"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": "campaigns",
"localField": "_campaign_id",
"foreignField": "_id",
"as": "campaign",
},
},
{"$unwind": "$campaign"},
{
"$match": bson.M{
"campaign.is_published": true, // Attached campaign is active
},
},
})
var result []*EventBoost
if err := pipe.All(&result); err != nil {
return "", err
}
if len(result) == 0 {
return "standard", nil
}
return result[0].Level, nil
}
如果您最多只需要一个EventBoost
(或者可能不会同时有更多),请使用$limit
stage将结果限制为一个,然后$project
仅用于获取level
字段,仅此而已。
使用此管道进行上述简化/优化:
pipe := c.Pipe([]bson.M{
{
"$match": bson.M{
"_event_id": eventID, // Boost for the specific event
"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": "campaigns",
"localField": "_campaign_id",
"foreignField": "_id",
"as": "campaign",
},
},
{"$unwind": "$campaign"},
{
"$match": bson.M{
"campaign.is_published": true, // Attached campaign is active
},
},
{"$limit": 1}, // Fetch at most 1 result
{
"$project": bson.M{
"_id": 0, // We don't even need the EventBoost's ID
"level": "$level", // We do need the level and nothing more
},
},
})
问题内容: 我如何将下面的切片查询写入golang? 尝试过但不起作用 找不到任何东西。有任何想法吗? 先感谢您 问题答案: 使用只能指定过滤器。但是,您有一个预测: 可以使用来指定投影,因此这就是您可以应用in投影的方式: 另请注意,确定您过滤的属性是还是只是一个错字,应该是。如果是后者,您还可以使用按文档ID查询:
问题内容: 我在 MySQL中* 有如下的 注释 表: * 用户可以添加 新的 注释,因为它们不是其他注释的子对象,所以将没有parent_id。用户还可以 回复 通过先前方法添加的评论,因此它们是主要评论的子级,例如在第二层级上。该 PARENT_ID 列表示父评论的ID,如果存在的话。如果注释没有父母,则默认 parent_id 为-1。 话虽如此,我想查询表中的所有注释,每个父项后跟其子级,
本文向大家介绍MongoDB中查询数组以获取特定值,包括了MongoDB中查询数组以获取特定值的使用技巧和注意事项,需要的朋友参考一下 要从数组中获取特定值,请使用aggregate()和$project。让我们创建一个包含文档的集合- 在find()方法的帮助下显示集合中的所有文档- 这将产生以下输出- 以下是如何在MongoDB中查询数组- 这将产生以下输出-
问题内容: 我需要递归地对子矩阵进行并行处理(将原始矩阵分为4个并传递给一个方法)。矩阵存储为2D数组。我不能每次都将元素复制到一个新的矩阵,因为事实证明这是非常昂贵的。是否有某种方式可以引用Java中的子矩阵? 也许,这个问题不清楚,我在[这里]http://codingdict.com/questions/131438)没有得到答案。 问题答案: 我将为数据编写一个包装器,并将其称为Matri
问题内容: 我需要使用ObjectIdHex获取值,并进行更新并查看结果。我正在使用mongodb和golang,但是下面的代码无法正常工作 没有为我工作,并给我以下输出 我该如何解决这个问题?我需要使用oid获得价值并进行更新,我该怎么做 问题答案: 应该不是:
本文档描述了QuerySet API的详细信息。它建立在模型和数据库查询指南的基础上,所以在阅读本文档之前,你也许需要首先阅读这两部分的文档。 本文档将通篇使用在数据库查询指南中用到的Weblog 模型的例子。 何时对查询集求值(要写到程序里的字段麻烦不要自作聪明翻译谢谢) 在内部,可以创建、过滤、切片和传递查询集而不用真实操作数据库。在你对查询集做求值之前,不会发生任何实际的数据库操作。 你可以