Как заполнить пользователей сообщениями с идентификатором пользователя в mon goose? - PullRequest
0 голосов
/ 07 мая 2020

Я создаю свое первое приложение MERN, и я столкнулся с этой проблемой: у меня есть сообщения, содержащие идентификатор пользователя:

{
    "reward": {
        ...
    },
    "_id": "5eb2d90d7d56c415cc4d5f97",
    "user": "5eabbb85b8814723fcee0f01",
    "text": "Body text hihi hahha",
    "createdAt": "2020-05-06T15:34:37.439Z",
    "__v": 0
}

Мне удалось автоматически добавить идентификатор пользователя в пост при создании в пост-контроллере. Теперь проблема в том, что я не знаю, где и как мне указать sh идентификатор созданного сообщения в массиве сообщений в пользовательской модели. Вот что такое модель User:

    username: {
    type: String,
    required: [true, "Username is required"],
    unique: true,
    trim: true,
    minlength: 3,
    maxlength: 15,
  },
  email: {
    type: String,
    required: [true, "Email is required"],
    unique: true,
  },
  role: {
    type: String,
    enum: ["user"],
    default: "user",
  },
  cards: [
    {
      type: mongoose.Schema.ObjectId,
      ref: "Card"
    },
  ],

И прямо там, где находятся «карточки», я хотел бы иметь идентификаторы сообщений, которые содержат идентификатор пользователя в поле пользователя. Это модель Post:

    user: String,
  text: {
    type: String,
  },
  reward: {
    ...
  },
  user: {
    type: mongoose.Schema.ObjectId,
    ref: 'User',
    required: true
  },

Это контроллер для сохранения сообщения в базе данных:

exports.addCard = asyncHandler(async (req, res, next) => {
    //Add user to req.body
    req.body.user = req.user.id;

    const card = await Card.create(req.body);

    res.status(201).json({
        success: true, 
        message: 'Card created', 
        data: card
    });
});

Я предполагаю, что это должно произойти при создании сообщения, что-то вроде нажимая этот идентификатор сообщения в массив сообщений в пользовательском модальном окне текущего вошедшего в систему пользователя? Как это можно правильно заархивировать?

1 Ответ

1 голос
/ 07 мая 2020

Вы можете сделать второй запрос, чтобы вставить _id.

Убедитесь, что _id at $match - это ObjectId, например ObjectId("5d345234daa45"), а не 5d345234daa45

exports.addCard = asyncHandler(async (req, res, next) => {
    //Add user to req.body
    req.body.user = req.user.id;

    const card = await Card.create(req.body);

    const id = card._id; // this should be your _id,  check with console.log() if this is your _id

    //dont forget to import your model 
    await User.update({ _id: mongoose.Types.ObjectId(req.body.user) },
       {
          $push: {
             cards: id
          }
       });


    res.status(201).json({
        success: true, 
        message: 'Card created', 
        data: card
    });
});
...