模型结构中的嵌套文档

huangapple go评论82阅读模式
英文:

Nested documents in model struct

问题

假设你有一个名为UserModel的结构体,其中包含一个名为Orders的字段。你想知道在这种情况下,最佳的存储方式是什么。

根据你提供的代码,Orders字段可以有三种可能的类型:

  1. []string:这意味着Orders是一个字符串数组,每个字符串表示一个订单的ID或其他标识符。这种方式适用于订单ID是以字符串形式存储的情况。

  2. []bson.ObjectId:这意味着Orders是一个bson.ObjectId的数组,每个bson.ObjectId表示一个订单的引用。这种方式适用于订单ID是以bson.ObjectId形式存储的情况。

  3. []OrderModel:这意味着Orders是一个OrderModel的数组,每个OrderModel表示一个完整的订单对象。这种方式适用于你想在UserModel中直接存储完整的订单对象的情况。

选择最佳的存储方式取决于你的具体需求和使用场景。如果你只需要存储订单的ID或其他标识符,并且在需要时可以通过ID来查询订单的详细信息,那么使用[]string[]bson.ObjectId都是合理的选择。如果你需要在UserModel中直接存储完整的订单对象,并且在需要时可以直接访问订单的所有属性,那么使用[]OrderModel是最合适的方式。

需要注意的是,无论你选择哪种方式,都需要在PopulateOrders函数中根据具体的查询逻辑来获取订单数据,并将其赋值给user.Orders字段。

英文:

Say I have a UserModel like so:

type (
    OrderModel struct {
         ID   bson.ObjectId `json:"id" bson:"_id"`
         ...
    }

    UserModel struct {
         ...
         // What do I store here? Is this an array of strings? An array of bson.ObjectID? Or an Array of OrderModel?
         Orders  []string        `json:"orders" bson:"orders"`
         Orders  []bson.ObjectId `json:"orders" bson:"orders"`
         Orders  []OrderModel    `json:"orders" bson:"orders"`
         ...
    }
)

func (user *UserModel) PopulateOrders() {
    orders := []OrderModel{}

    // Query orders and assign to variable orders to then be assigned the the user Object
    // {magic query here}

    user.Orders = orders
}

In MongoDB, an array of ObjectIDs would be stored to reference the OrderModel documents. Later on, I have a function that will populate the Order documents like described above: PopulateOrders.

What is the best way for the case above?

答案1

得分: 1

我会使用两个单独的字段,一个用于存储ID的切片,另一个用于存储惰性加载的对象的切片。

在保存时省略惰性加载的对象切片。代码可能如下所示:

type UserModel struct {
     // ...
     OrderIDs []bson.ObjectId `json:"orderIDs" bson:"orderIDs"`
     Orders   []OrderModel    `json:"orders" bson:"-"`
     // ...
}

请注意,我故意没有将Orders从JSON序列化中排除,因为在JSON表示中它可能是有用的。

英文:

I would use 2 separate fields, one for the slice of IDs, and one for the slice of lazily loaded objects.

Omit the lazily loaded object slice from saving. It could look like this:

type UserModel struct {
     // ...
     OrderIDs []bson.ObjectId `json:"orderIDs" bson:"orderIDs"`
     Orders   []OrderModel    `json:"orders" bson:"-"`
     // ...
}

Note that I intentionally did not exclude Orders from JSON serialization, as it is (may) be useful in JSON representation.

huangapple
  • 本文由 发表于 2017年1月30日 14:43:18
  • 转载请务必保留本文链接:https://go.coder-hub.com/41930292.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定