MongoDB высевает вложенный массив объектов - PullRequest
0 голосов
/ 02 мая 2018

У меня есть MongoDB, где я заполняю данные БД из файлов JSON. Файлы JSON структурированы правильно, и начальный файл в основном работает. Проблема, с которой я столкнулся, заключается в том, что вложенный массив объектов заполняется только идентификатором Mongo, а не целым объектом. Я пробовал несколько функций сбора (collection.insert(), collection.save(), ...), но все они возвращают одно и то же.

Вот как должны выглядеть данные, где проекты - это вложенный массив объектов:

{
    "client_name": "2017 Colorado Hospital Association",
    "projects": [
      {
        "project_name": "2017 Project",
        "p_number": "CHA201652",
        "hours_used": 356.03,
        "approved_hours": null
      }
    ]
  }

Вот что возвращается:

{
  "projects": [
    "5ae8d05b5ee3f79bfdefd357"
  ],
  "_id": "5ae8d05b5ee3f79bfdefd39d",
  "client_name": "2017 Colorado Hospital Association",
  "__v": 0
},

Итак, вот мой файл seed.js:

// Require DB Models
const db = require('./models');
const clientList = require('./data/client.json');
const userList = require('./data/user.json');
const projectList = require('./data/projects.json');

// SEEDING THE DB
db.User.remove({}, (err, users) => {
  console.log('Removed All Users');
  db.User.create(userList, (err, users) => {
    if(err) {
      console.log('DB User creation err: ', err);
    }
    console.log('Created User DB!');
  });
});

db.Project.remove({}, (err, projects) => {
  console.log('Removed Projects');
  db.Project.create(projectList, (err, projects) => {
    if(err) {
      console.log('DB Project Creation Err: ', err);
    }
    console.log('Created Project DB!');

    // Client Creation
    db.Client.remove({}, (err, clients) => {
      console.log('Removed All Clients');
      clientList.forEach((clientData) => {
        let client = new db.Client({
          client_name: clientData.client_name,
          projects: []
        });
        // console.log('client data: ', clientData);
        clientData.projects.forEach((projectData) => {
          // console.log('project data: ', projectData);
          db.Project.findOne({p_number: projectData.p_number}, (err, foundProject) => {
            if(err) {
              console.log('Find Project Err: ', err);
            }
            // console.log('found project: ', foundProject);
            client.projects.push(foundProject);
            // console.log('client post push: ', client);
            client.save((err, savedClient) => {
              if(err) {
                console.log('Save Client Err: ', err);
              }
            });
          });
        });
      });
    });
  });
});

Файл Project.js:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const ProjectSchema = new Schema({
    project_name: String,
    p_number: String,
    hours_used: Number,
    approved_hours: Number,
    remaining_hours: Number
});

const Project = mongoose.model('Project', ProjectSchema);

module.exports = Project;

Файл Client.js:

const mongoose = require('mongoose');
const Schema = mongoose.Schema;
const Project = require('./project');

const ClientSchema = new Schema({
  client_name: String,
  projects: [
    {type: Schema.Types.ObjectId, ref: 'Project '}
  ]
});

// MODEL
const Client = mongoose.model('Client', ClientSchema);

// EXPORT
module.exports = Client;

И мой файл index.js:

const mongoose = require('mongoose');
mongoose.connect(process.env.MONGODB_URI || process.env.MONGOLAB_URI || process.env.MONGOHQ_URL || 'mongodb://localhost/client-portal');

module.exports.Client = require('./client');
module.exports.User = require('./user');
module.exports.Project = require('./project');

Я просмотрел несколько стековых вопросов по этому поводу, и $set не сработал, поскольку ему нужно найти все проекты по номеру p_number и затем связать его с клиентом.

Любая помощь будет большой благодарностью!

...