Golang导入的字段与标准字段声明的行为不同

时间:2018-01-16 18:08:47

标签: go mgo

我将尝试简化问题而不是将整个项目纳入范围,因此如果您有任何疑问,我会尝试使用更多信息进行更新。

我正在使用3种结构:

type Ticket struct{
  ID bson.ObjectID `json:"id" bson:"_id"`
  InteractionIDs []bson.ObjectId `json:"interactionIds" bson:"interactionIds"`
  TicketNumber int `json:"ticketNumber" bson:"ticketNumber"`
  Active bool `json:"active" bson:"active"`
  // Other fields not included
}

type TicketInteraction struct{
  ID bson.ObjectID `json:"id" bson:"_id"`
  Active bool `json:"active" bson:"active"`
  // Other fields not included
}

type TicketLookupTicket struct{
  Ticket
  Interactions []TicketInteraction `json:"interactions" bson:"interactions"`
}

然后我有一个mgo管道,我正在与两个集合“加入”

var tickets []TicketLookupTicket
c := mongodb.NewCollectionSession("tickets")
defer c.Close()

pipe := c.Session.Pipe(
  []bson.M{
    "$lookup": bson.M{
      "from": "ticketInteractions",
      "localField": "interactionIds",
      "foreignField": "_id",
      "as": "interactions",
    }
  },
)
pipe.All(&tickets)

现在应该使用数据库中的结果填充故障单,但实际发生的情况是仅填充了每个故障单中的交互。最终看起来像这样:

[
  {
    ID: ObjectIdHex(""),
    InteractionIDs: nil,
    TicketNumber: 0,
    Active: false,
    // Other Fields, all with default values
    Interactions: []{
      {
        ID: ObjectIdHex("5a441ffea1c9800148669cc7"),
        Active: true,
        // Other Fields, with appropriate values
      }
    }
  }
]

现在,如果我手动声明TicketLookupTicket结构中的某些Ticket结构字段,那么这些字段将开始填充。例如:

type TicketLookupTicket struct{
  Ticket
  ID bson.ObjectId `json:"id" bson:"_id"`
  TicketNumber int `json:"ticketNumber" bson:"ticketNumber"`
  Active bool `json:"active" bson:"active"`
  Interactions []TicketInteraction `json:"interactions" bson:"interactions"`
}

现在ID,TicketNumber和Active将开始填充,但其余字段不会填充。

有人可以解释为什么导入的Ticket字段与声明的字段的行为不一样吗?

1 个答案:

答案 0 :(得分:1)

Per the documentation,您需要将inline标记添加到字段中:

type TicketLookupTicket struct{
  Ticket `bson:",inline"`
  Interactions []TicketInteraction `json:"interactions" bson:"interactions"`
}
  

inline内联字段,该字段必须是结构或地图。              内联结构的处理就好像它的字段是一部分一样              外结构。内联映射会导致密钥执行              不匹配要插入的任何其他结构字段              映射而不是像往常一样被丢弃。

默认情况下,它假定嵌入字段Ticket应由TicketLookupTicket.Ticket处的对象填充。