Проекции в Mongodb не работают должным образом - PullRequest
1 голос
/ 19 октября 2019

У меня есть эти данные в моей базе данных 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
      ...
   }
}

Вот моя структура драйвера

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

Вот моя структура студента

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

Автомобильstruct

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"`
}

И я использую эту функцию, чтобы получить все драйверы из базы данных

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
}

Но ответ, который я получаю в почтальоне, смешен

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

Одна вещь в порядке, что в ответ я получаю два объекта, которые хороши, потому что, как мой filter offertest isdriver: true, у меня есть три документа в базе данных, в которых два из них имеют isdriver: true.

Кто-нибудь может мне помочь с этим? Почему я получаю этот ответ?

1 Ответ

2 голосов
/ 20 октября 2019

Вы делаете поиск в коллекции студентов, но декодируете в драйвер. Это нужно изменить.

    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)
    }

Кроме того, вам не хватает тега Inline struct для поля Driver 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"`
}

То же самое, конечно, идет для всех упомянутых структур. Рабочий пример кода: https://gist.github.com/mwmahlberg/c46ec3ad3ccee028f0666ff7d5d8d98b

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...