Tengo estos datos en mi base de datos mongoDB.

{ 
   "_id":"5d9ce9fd270eae22adb95d70",
   ...
   "isdriver":true,
   "driver":{ 
      "walletmoney":0,
      "license":"6eef8271-62d7-4a1c-972a-2c40a773b35a",
      "vehicle":{ 
         "image":"b6c3619b-86e6-49d0-8734-e2c48815dfc1",
         "insurance":"5f8229c4-4700-4059-8b72-9344a2bc6092",
         "manufacturer":"Tesla",
         "model":"Model 3",
         "vin":"12345678912345678",
         "year":2018
      },
      "verified":false
      ...
   }
}

Aquí está mi estructura de controlador

type Driver struct {
    ...
    Verified         bool    `json:"verified,omitempty"`
    License          string  `json:"licenseimage,omitempty"`
    ...
    Vehicle          Vehicle `json:"vehicle,omitempty"`
}

Aquí está mi estructura de estudiante

type Student struct {
    ID                primitive.ObjectID `bson:"_id,omitempty"`
    ...
    IsDriver          bool               `json:"isdriver,omitempty"`
    Driver            Driver             `json:"driver,omitempty"`
}

Estructura del vehículo

type Vehicle struct {
    Image        string `json:"vehicleimage,omitempty"`
    Insurance    string `json:"insuranceimage,omitempty"`
    VIN          string `json:"vin,omitempty"`
    Manufacturer string `json:"manufacturer,omitemptyr"` <-----(Edit) Find out this is also wrong
    Model        string `json:"model,omitempty"`
    Year         uint16 `json:"year,omitempty"`
}

Y estoy usando esta función para obtener todos los controladores de la base de datos

func GetAllDrivers() []model.Driver {

    // Options
    projections := bson.D{
        {"driver", 1},
        /* {"driver.verified", 1},
        {"driver.license", 1}, */
    }

    // Filter for search
    filter := bson.M{"isdriver": true}

    // Return student collection (*mongo.Collection)
    studentCollection := GetStudentCollection()
    cur, err := studentCollection.Find(context.TODO(), filter, options.Find().SetProjection(projections))

    // Error while finding documents
    if err != nil {
        fmt.Print(err)
        return []model.Driver{}
    }

    var drivers []model.Driver
    var driver model.Driver

    // Get the next result from the cursor
    for cur.Next(context.TODO()) {
        err := cur.Decode(&driver)
        if err != nil {
            fmt.Print(err)
        }
        drivers = append(drivers, driver)
    }
    if err := cur.Err(); err != nil {
        fmt.Print(err)
    }
    cur.Close(context.TODO())
    return drivers
}

Pero la respuesta que recibo en el cartero es ridícula

[
    {
        "vehicle": {
            "manufacturer": ""
        }
    },
    {
        "vehicle": {
            "manufacturer": ""
        }
    }
]

Una cosa está bien: en respuesta, obtengo dos objetos que están bien porque, como mi filter sugerencia isdriver: true, tengo un total de tres documentos en la base de datos en los que dos de ellos tienen isdriver: true .

¿Puede alguien ayudarme con esto? ¿Por qué recibo esta respuesta?

1
OhhhThatVarun 19 oct. 2019 a las 20:56

1 respuesta

La mejor respuesta

Está buscando en la colección de estudiantes, pero decodifica en un controlador. Esto debe cambiarse.

    var drivers []Driver
    var student Student

    // Get the next result from the cursor
    for cur.Next(context.TODO()) {
        err := cur.Decode(&student)
        if err != nil {
            fmt.Println(err)
        }
        drivers = append(drivers, student.Driver)
    }

Además, le falta una etiqueta de estructura Inline para el campo Driver de Student:

type Student struct {
    ID       primitive.ObjectID `bson:"_id,omitempty"`
    IsDriver bool               `json:"isdriver,omitempty"`
    // Note that Inline is uppercase.
    Driver   Driver             `json:"driver,omitempty" bson:"driver,Inline"`
}

Lo mismo, por supuesto, se aplica a todas las estructuras referenciadas. Ejemplo de código de trabajo: https://gist.github.com/mwmahlberg/c46ec3ad3ccee0b28d5d8d98b" rel="nofollow noreferrer"> https://gist.github.com/mwmahlberg/c46ec3ad3ccee028d5d0666ff7

2
Markus W Mahlberg 19 oct. 2019 a las 22:55