如何使用mgo在单个集合中处理多种类型

Alex Voskresenskiy:

我是golang的新手,并尝试使用mongodb作为后备数据库来编写一个简单的事件源用户管理webapi。现在我有了User,它看起来像这样:

type User struct {
Id       bson.ObjectId `json:"id" bson:"_id"`
UserName string        `json:"username" bson:"username"`
Email    string        `json:"email" bson:"email"`
PwdHash  string        `json:"pwd_hash" bson:"pwd_hash"`
FullName string        `json:"fullname" bson:"fullname"`
}

当有人使用api时,发生在用户身上的三个事件:

type UserCreatedEvent struct {
    UserId         bson.ObjectId `json:"id" bson:"_id"`
    //time when event was issued
    CreatedEpoch   time.Time     `json:"created_epoch" bson:"created_epoch"`
    //id of user that made a change
    IssuedByUserId bson.ObjectId `json:"issuedby_userid" bson:"issuedby_userid"`
}

type UserDeletedEvent struct {
    UserId         bson.ObjectId `json:"id" bson:"_id"`
    CreatedEpoch   time.Time     `json:"created_epoch" bson:"created_epoch"`
    //id of user that made a change
    IssuedByUserId bson.ObjectId `json:"issuedby_userid" bson:"issuedby_userid"`
}

type UserUpdatedEvent struct {
    UserId         bson.ObjectId `json:"id" bson:"_id"`
    CreatedEpoch   time.Time     `json:"created_epoch" bson:"created_epoch"`
    //id of user that made a change
    IssuedByUserId bson.ObjectId `json:"issuedby_userid" bson:"issuedby_userid"`
    ChangedFieldName     string  `json:"changed_field_name" bson:"changed_field_name"`
    NewChangedFieldValue string  `json:"new_changed_field_value" bson:"new_changed_field_value"`
}

现在,我一直在保存和检索db中的事件。问题是我想将它们存储在单个集合中,这样我就拥有用户修改的完整历史记录。但是我找不到如何正确将事件类型名称存储为mongo文档字段,然后在搜索中使用它的方法。这样做的惯用方法是什么?

如果有任何帮助,我将不胜感激。

加文:

非关系数据库的好处是,可以稍微冗余一点,并且由于您没有将所有东西连接在一起,因此检索起来更快。您可以按照User对您和数据有意义的任何方式,将底部的三个对象添加为属性然后,您也不需要UserId在这些对象上存储

如果您需要Events快速搜索,可以创建另一个集合来保存它们。您将插入两个集合,但是检索时间/逻辑应该非常好/易于编写。

您的新产品Event将类似于:

type UserEventType int

const (
    Created UserEventType = iota
    Deleted
    Updated
)

type UserEvent struct {
    UserId               bson.ObjectId `json:"id" bson:"_id"`
    CreatedEpoch         time.Time     `json:"created_epoch" bson:"created_epoch"`
    //id of user that made a change
    IssuedByUserId       bson.ObjectId `json:"issuedby_userid" bson:"issuedby_userid"`
    ChangedFieldName     string        `json:"changed_field_name,omitempty" bson:"changed_field_name,omitempty"`
    NewChangedFieldValue string     `json:"new_changed_field_value,omitempty" bson:"new_changed_field_value,omitempty"`
    EventType            UserEventType `json:"user_event_type" bson:"user_event_type"`
}

请注意,omitempty取决于事件类型,字段是可选的。

您真的不应该在同一集合中存储不同的对象。这是Mongo文档中的一行:

MongoDB将文档存储在集合中。集合类似于关系数据库中的表。

如果您对关系数据库不熟悉,则表实际上将代表一种类型的对象。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

MongoDB - 在单个集合中插入多种类型的对象

如何使用picocli处理多种类型的期权

Swift结构:为单个属性处理多种类型

如何从 dart flutter 中的单个泛型类返回多种类型的类类型?

Sulu Pagebuilder:在集合中添加多种类型

Java集合可在键值对中存储多种类型的数据

保存多种类型中的单个枚举值

如何在同一事件发射器中处理多种类型-Typescript

如何在Google Map iOS SDK中处理多种类型的集群

如何正确处理多种类型的TypeScript值

如何使用类型提示为参数指定多种类型?

Haskell 中的“多种类型”

如何使用原因反应定义在函数签名中接受多种类型的绑定?

如何在 Laravel 中为多种类型的管理员使用中间件?

处理多种类型的数据的AJAX请求

在Haskell中,如何重新排序多种类型

如何在Golang中为多种类型编写函数?

如何在Firebase中推送多种类型的数据?

如何在函数中接受多种类型作为参数?

如何使用RTypeProvider创建多种类型的数据框

如何在NSUserDefaults中使用(多种类型)保存数组

如何使用Unity按名称注册多种类型?

如何使用ngComponentOutlet对多种类型的组件进行ngFor?

领域-如何使用多种类型的对象构建供稿?

在C#中跨多种类型使用列表

在为多种类型的产品创建推荐系统时,您如何处理隐式评分中的偏差?

使用Jackson序列化器的Redis进行Spring缓存:如何处理多种类型的域对象

是否可以将多种类型的对象存储到1个mongodb集合中?

CosmosDB / DocumentDB在同一集合中具有多种类型的分区