Как создать документ с данными из другой коллекции? - PullRequest
0 голосов
/ 16 января 2020
const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const CompanySchema = new Schema(
  {
    companyName: {
      type: String,
      required: true,
      unique: true
    },
    taxOffice: {
      type: String
    },
    taxNumber: {
      type: String
    },
  },
  {
    timestamps: true
  }
);

const Company = mongoose.model('Company', CompanySchema);
module.exports = Company;
const mongoose = require('mongoose');

const Schema = mongoose.Schema;

const DateSchema = new Schema({
  name: {
    type: String,
    unique: true,
    required: true
  },
  companies: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Company' }]
});

const Date = mongoose.model('Date', DateSchema, 'dates');
module.exports = Date;
const router = require('express').Router();
const Date = require('../models/date');

router.route('/').get((req, res) => {
  Date.find()
    .then(dates => res.json(dates))
    .catch(err => res.status(400).json('Error: ' + err));
});

router.route('/add').post((req, res) => {
  const name = req.body.name;

  const newDate = new Date({ name });

  newDate
    .save()
    .then(() => res.json('Date added!'))
    .catch(err => res.status(400).json('Error: ' + err));
});

module.exports = router;
  • У меня есть 2 коллекции, названные Company и Date.
  • Я вставил много данных в Collection Company.
  • Но мне нужны эти данные Company (компании) копировать в Date Collection всякий раз, когда я создаю документ Date.
  • Я хочу хранить данные компании в виде массива для каждой даты.
  • Кстати, не знаю, что моя схема Дизайн подходит для этой цели. Что мне делать?
  • Я хочу получить документ типа Date:
{
    name: "DECEMBER-2019", 
    companies: ['5e2076236664640d22515f7b', '5e2076236664640d22515f7a']
}

Ответы [ 3 ]

0 голосов
/ 16 января 2020

Предполагая, что только компании, присутствующие на момент создания Объекта Date, должны быть добавлены в поле Date компании, тогда вы можете поддерживать кеш ObjectIds компаний в любой момент времени, который будет обновляться при каждом удалении. / вставить в фирменную коллекцию.

Вы можете написать свою собственную функцию создания объекта даты, который будет иметь имя параметра, к которому будут добавлены идентификаторы текущих компаний.

Date.statics.getNewDateObject = function(name) {
   let companyIds = await getCachedCompanyIds();
   return new Date({name: name, companies: companyIds});
}

Это будет документ, подобный:

{ name: "TODAY'S DATE", companies: ['5e2076236664640d22515f7b', '5e2076236664640d22515f7a'] }

Если вы хотите заполнить объект Date полной информацией о компании, вы можете использовать метод заполнить , представленный в mon goose, который заполняет полную информацию о компании в Date Объект.

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

0 голосов
/ 17 января 2020

Я решил это:

router.route('/add').post((req, res) => {
  const name = req.body.name;
  Company.find().then(companies => {
    const newDate = new Date({ name, companies });
    newDate
      .save()
      .then(() => res.json('Date added!'))
      .catch(err => res.status(400).json('Error: ' + err));
  });
});
0 голосов
/ 16 января 2020

Звучит так, будто вы хотите выполнить действие, когда создаете новый документ в коллекции дат. Если вы используете Atlas (полностью управляемая база данных MongoDB в качестве службы), вы можете настроить триггер на запуск при каждом добавлении нового документа в коллекцию Date. Другой вариант (независимо от того, используете вы Atlas или нет) - использовать Change Streams для отслеживания изменений в коллекции дат. Подробнее о том, как их настроить, см. https://www.mongodb.com/blog/post/node-js-change-streams-and-triggers.

...