Non puoi usare un'interfaccia in un documento per il motivo che hai notato. Il decoder non ha informazioni sul tipo da creare.
Un modo per gestirlo è definire una struttura che contenga le informazioni sul tipo:
type NodeWithType struct {
Node Node `bson:"-"`
Type string
}
type Workflow struct {
CreatedAt time.Time
StartedAt time.Time
CreatedBy string
Nodes []NodeWithType
}
Implementare la funzione SetBSON su questo tipo. Questa funzione dovrebbe decodificare la stringa del tipo, creare un valore del tipo corretto basato su quella stringa e annullare il marshalling su quel valore.
func (nt *NodeWithType) SetBSON(r bson.Raw) error {
}