Как выбрать все впечатления из указанного c профиля пользователя в Node и Mon goose из встроенной схемы - PullRequest
0 голосов
/ 22 января 2020

Я создаю API в NodeJS Express и MongoDB, используя Mon goose. Я создал модель профиля, которая встраивает схему опыта. Например:

{
    "_id": "5e26ff6d5be84a3aeeb2f7bb",
    "username": "some"
    <fields of the profile>
    "experience": [
        {
            "image": "",
            "createdAt": "2020-01-21T13:41:01.873Z",
            "updatedAt": "2020-01-21T13:41:01.873Z",
            "_id": "5e26ff6d5be84a3aeeb2f7bc",
            "title": "Senior Dev",
            "role": "Dev",
            "company": "ArosaDev",
            "startDate": "2018-12-03T23:00:00.000Z",
            "endDate": null,
            "description": "",
            "area": ""
        }
    ],
    "createdAt": "2020-01-21T13:41:01.874Z",
    "updatedAt": "2020-01-21T13:41:01.874Z",
    "__v": 0
}

Проблема в том, что мне нужно создать конечную точку GET, которая получает для одного профиля все опыты.

experienceRouter.get("/:username", async(req, res) => {

    console.log(req.params.username);

    const experiences = await Profiles.findOne({"username":req.params.username} ??? );

    res.send(experiences);
});

Я знаю, что должен выбрать встроенный полевой опыт и получить назад все опыты, но я не знаю, как мне поступить с Mon goose в моем маршруте.

Я не знаю, что будет после выбора имени пользователя и как я могу выбрать все впечатления для имени пользователя, которого я запрашивал.

Я новичок в этом и не могу найти хороших ссылок, объясняющих мне это навсегда.

Я буду признателен за пример того, как такой маршрут должен быть сделан.

Моя модель:

// Profile Schema model
// Embedded we have the Experience as []
const mongoose = require("mongoose");
const { isEmail } = require("validator");


const experienceSchema = new mongoose.Schema({

        title: {
            type: String,
            required: true
        },
        role: {
            type: String,
            required: true
        },
        company: {
            type: String,
            required: true
        },
        startDate: {
            type: Date,
            required: true
        },
        endDate: {
            type: Date
        },
        description: {
            type: String
        },
        area: {
            type: String
        },
        createdAt: {
            type: Date,
            default: Date.now,
            required: false
        },

        updatedAt: {
            type: Date,
            default: Date.now,
            required: false
        },

        image: {
            type: String,
            required: false,
            default: "https://via.placeholder.com/150"
        }

})



const profileSchema = new mongoose.Schema({

    firstname: {
        type: String,
        required: true
    },

    surname: {
        type: String,
        required: true
    },

    email: {
        type: String,
        trim: true,
        lowercase: true,
        unique: true,
        required: true,
        validate: {
            validator: string => isEmail(string),
            message: "Provided email is invalid"
        }
    },

    bio: {
        type: String,
        required: true
    },

    title: {
        type: String,
        required: true
    },

    area: {
        type: String,
        required: true
    },

    imageUrl: {
        type: String,
        required: false,
        default: "https://via.placeholder.com/150"
    },

    username: {
        type: String,
        required: true,
        unique: true
    },

    experience: [
        experienceSchema
    ],

    createdAt: {
        type: Date,
        default: Date.now,
        required: false
    },

    updatedAt: {
        type: Date,
        default: Date.now,
        required: false
    }
});

const collectionName = "profiles";
const Profile = mongoose.model(collectionName, profileSchema);

module.exports = Profile;

1 Ответ

1 голос
/ 22 января 2020

замените ваш код следующим:

Вы можете указать свои поля, которые вам нужны, во втором аргументе функции, который называется проекцией , как упоминалось

Так что для включения поля используют 1, а для исключения полей - 0

experienceRouter.get("/:username", async(req, res) => {

    console.log(req.params.username);

    const profile = await Profiles.findOne({"username":req.params.username},{experience:1 ,username:1, _id:0}).lean();

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