У меня есть 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 и затем связать его с клиентом.
Любая помощь будет большой благодарностью!