我将尝试简化问题而不是将整个项目纳入范围,因此如果您有任何疑问,我会尝试使用更多信息进行更新。
我正在使用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字段与声明的字段的行为不一样吗?
答案 0 :(得分:1)
Per the documentation,您需要将inline
标记添加到字段中:
type TicketLookupTicket struct{
Ticket `bson:",inline"`
Interactions []TicketInteraction `json:"interactions" bson:"interactions"`
}
inline
内联字段,该字段必须是结构或地图。 内联结构的处理就好像它的字段是一部分一样 外结构。内联映射会导致密钥执行 不匹配要插入的任何其他结构字段 映射而不是像往常一样被丢弃。
默认情况下,它假定嵌入字段Ticket
应由TicketLookupTicket.Ticket
处的对象填充。