Вставка данных в MongoDB из одного модуля схемы в другой - PullRequest
0 голосов
/ 25 февраля 2019

Я использую MongoDB с Mongoose, мне нужно сохранить данные пользователя для пользователей коллекции, которая содержит имя пользователя, пароль и данные компании данных, * Данные компании будут иметь Название компании, адрес и URL веб-сайта Теперь я создал другую схему для компании и пользователей

Мне нужно хранить данные пользователя вместе с идентификатором компании после установки в коллекцию компании, например

{
  username: "Lorem Ipsum",
  password: "Dolar Sit",
  company: "5c73afcf9a3bde1a40da5184"
}

примерно так (Примечание: эта случайная строка является идентификатором данных компании), но я отправлю все в 1 объекте, как показано ниже

{
  username: "Lorem Ipsum",
  password: "Dolar Sit",
  company: {
     company_name: "Blah Blah",
     company_address: "Blah Blah Blah",
     company_website: "BlahBlah.com",
  }
}

Моя пользовательская схема (user.js):

const mongoose = require ('mongoose');

const Company = require('./company');
Schema = mongoose.Schema

// User Schema
const userSchema = mongoose.Schema({
    username:{
        type: String,
        required: true
    },
    password:{
        type: String,
        required: true
    },
    company:{
        type: [{ type: Schema.Types.ObjectId, ref: 'Company' }],
        required: true
    },
    created_on:{
        type: Date,
        default: Date.now
    },
    updated_on:{
        type: Date,
        default: Date.now
    }
});

const User = module.exports = mongoose.model('Users', userSchema);
// Add User
module.exports.addUser = (user, callback) => {
    User.create(user, callback);
}

И схема компании есть (компания.js):

const mongoose = require('mongoose');

// Book Schema
const companySchema = mongoose.Schema({
    company_name:{
        type: String
    },
    target_address:{
        type: String
    },
    target_website:{
        type: String
    },
    created_on:{
        type: Date,
        default: Date.now
    },
    updated_on:{
        type: Date,
        default: Date.now
    }
});

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

// Add Company
module.exports.addCompany = (comp, callback) => {
    Company.create(comp, callback);
}

Теперь у меня вопрос: если я запускаю функцию Users.addUser и передаю ей вышеуказанный json, она должна сохранять / создавать пользователя вместе с компанией.и идентификатор компании должен быть сохранен в собственности компании в коллекции пользователей.если я получу пользователей, то он должен вернуть данные пользователя с данными компании, извлеченными с использованием этого идентификатора, сохраненного в базе данных

Как это сделать?

Если я запустил вышеуказанные файлы и попытался вставить данныек нему, он покажет ниже ошибка

 'Cast to Array failed for value "{ company_name: \'Moshi Moshi\', company_address: \'Bengaluru\' }" at path "company"',
        name: 'CastError',
        stringValue:
         '"{ company_name: \'Moshi Moshi\', company_address: \'Bengaluru\' }"',
        kind: 'Array',
        value: [Object],
        path: 'company',
        reason: [MongooseError] } },
  _message: 'Users validation failed',
  name: 'ValidationError' }
[nodemon] restarting due to changes...
[nodemon] starting `node app.js`
E:\MoshiMoshi\Projects\Maaamamia\blackhole-rest\models\users.js:17
        type: [{ type: ObjectId, ref: 'Company' }],
                       ^

ReferenceError: ObjectId is not defined

как добиться этой функциональности?

1 Ответ

0 голосов
/ 25 февраля 2019

во-первых, в вашей пользовательской схеме компания не должна быть массивом, потому что у пользователя будет только один идентификатор компании в соответствии с вашими требованиями.

 //incorrect
 company:{
    type: [{ type: Schema.Types.ObjectId, ref: 'Company' }],
    required: true
 },

 //correct
  company:{
     type: Schema.Types.ObjectId, 
     ref: 'Company',
     required: true
 },

А во-вторых, при добавлении пользователя вы передаете весь объект компаниик атрибуту компании.сначала необходимо добавить компанию, а затем сохранить _id сохраненного объекта компании в атрибуте компании пользователя, затем сохранить объект пользователя.

let yourJsonObject={
  username: "Lorem Ipsum",
  password: "Dolar Sit",
  company: {
     company_name: "Blah Blah",
     company_address: "Blah Blah Blah",
     company_website: "BlahBlah.com",
  }
}
      let companyObject=yourJsonObject.company;//your company object 
      let userObject= yourJsonObject //your user object

       let savedCompanyObject= //call add company method of your 
                                 //model with companyObject data
       userObject.company = savedCompanyObject._id;

      //now pass userObject to your addUser method of user model
...