Компромисс пн goose с REST API - PullRequest
       30

Компромисс пн goose с REST API

0 голосов
/ 19 февраля 2020

Мне нужно спросить - у меня есть конечная точка /users, и я хочу добавить задачи пользователю, вот так: /users/:username/tasks. Должен ли я создать другую модель и маршрут? Я не знаю, как добавить идентификатор в массив в модели Mon goose и добавить слаг с mongoose-url-slugs.

. Я хочу, чтобы он был RESTful настолько, насколько я могу. Итак, это: /users/:username/tasks или /tasks/:username? Если сначала, мне нужно знать, как добавить идентификатор к tasks в этой модели:

import mongoose from 'mongoose'

const User = mongoose.Schema({
    username: String,
    email: String,
    password: String,
    tasks: Array
}, {
    timestamps: true
})

export default mongoose.model('User', User)

1 Ответ

0 голосов
/ 19 февраля 2020

По моему мнению, вам следует создать новую модель задач .

Вы можете использовать ссылку на задач модель, подобную этой:

tasks: [{ type: Schema.Types.ObjectId, ref: 'tasks' }]

https://mongoosejs.com/docs/populate.html

Этот маршрут лучше, потому что вы добавляете задачу для пользователя, а не пользователя для задачи /users/:username/tasks

И тогда для связи вы можете использовать виртуальный пн goose: https://mongoosejs.com/docs/tutorials/virtuals.html

Пример: https://github.com/Automattic/mongoose/issues/6608

UserSchema.virtual('tasks', {
  lookup: (doc) => {
    return {
      from: 'tasks',
      let: { userId: '$_id' },
      pipeline: [{
        $match: {
          $expr: {
            $and: [{
              $eq: ['$refId', '$$userId']
            }]
          }
        }
      }, {
        $project: { name: 1, createdAt: 1 }
      }
      ],
      as: 'tasks',
    }
  }
});
userModel.find().populate('tasks').lean(true);
...