Как создать почтовый запрос для Express / Mon goose нормализованных отношений "многие ко многим" - PullRequest
0 голосов
/ 12 июля 2020
• 1000 родительский к дочерним документам.

Схема документа «Мое здание» включает идентификаторы пользователя и комнаты, как показано ниже:

const mongoose = require('mongoose');


const BuildingSchema = new mongoose.Schema({
 user: [
   {
     type: mongoose.Schema.Types.ObjectId,
     ref: "user"
   }
 ],
 room: [
   {
     type: mongoose.Schema.Types.ObjectId,
     ref: "room"
   }
 ],

Схема документа «Моя комната» включает идентификатор здания и другой дочерний документ следующим образом:

const mongoose = require('mongoose');

const RoomSchema = new mongoose.Schema({
  building: {
      type: mongoose.Schema.Types.ObjectId,
      ref: "building"
    },
  furniture: [
    {
      type: mongoose.Schema.Types.ObjectId,
      ref: "furniture"
    }
  ],

У меня возникли проблемы с пониманием того, как создать почтовый запрос, который позволяет пользователю / пользователям создавать экземпляр Building и несколько экземпляров Room, связанных с ним после ...

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

router.post('/createbuilding', [auth, [
  check('name', 'Building Name is required').not().isEmpty(),
 ]
], async (req, res) => {
    const errors = validationResult(req);
    if (!errors.isEmpty()) {
      return res.status(400).json({ errors: errors.array() });
    }
        
    const {
      name,
      type,
      website,
      location,
      bio,      
    } = req.body;

    const buildingFields = {
      user: req.user.id,
      //room: req.room.id,
      name,
      type,
      website: website && website !== '' ? normalize(website, { forceHttps: true }) : '',
      location,
      bio
    };

      try {
        let building = await Building.findOneAndUpdate(
          { user: req.user.id },
          //{ room: req.room.id },
          { $set: buildingFields },
          { new: true, upsert: true }
        );
        res.json(building);
      } catch (err) {
        console.error(err.message);
        res.status(500).send('Server Error');
      }
    }
  );

Примечание. Ссылки на идентификатор комнаты специально закомментированы, потому что это то, в чем я не уверен как включить в Почтовый запрос.

1 Ответ

0 голосов
/ 12 июля 2020

С Mon goose s .findOneAndUpdate() первым параметром является запрос документа, аналогично .findOne(). Ваш второй параметр - это поля для обновления. $set является избыточным, так как Mon goose сделает это за вас.

Если вы хотите добавить комнату к зданию, а не заменять все ассоциации, вам нужно добавить комнату с $push.

const buildingFields = {
  $push: {
    room: {
      req.room.id
    }
  },
  name,
  type,
  ...
}

Я также предполагаю, что вы предполагали, что пользовательское поле в BuildingSchema представляет собой единственную ассоциацию, а не множество ассоциаций. Если нет, вам нужно будет использовать $elemMatch для запроса этого документа:

Mon goose Mongodb запрашивает массив объектов

...