Почему бы вам не указать доход в качестве поля в пользовательской схеме, а вместо этого создать для него новую коллекцию?
Обновление:
Заполнение MongoDB всегда было запутанной функцией, в то время как документация не очень хорошо объясняет это.
Таким образом, при создании нового пользовательского документа вы должны хранить «id» дохода do c. в поле дохода. По сути, это означает type: Schema.Types.ObjectId
. Когда вы получаете пользовательский документ, вы должны позвонить .populate('website.income')
, после чего будет заполнено поле дохода. После того как заполнение произошло, документ о доходах в основном станет встроенным документом в пользовательском документе.
Так что, если вы все еще хотите получать доход в отдельной коллекции с некоторыми изменениями, ваш код должен выглядеть следующим образом:
//User Model file
const mongoose = require('mongoose')
const Schema = mongoose.Schema
const userSchema = new Schema({
username: {
type: String,
},
website: {
sitename: {
type: String
},
//Remove the array bracket []
income: {
type: Schema.Types.ObjectId,
ref: 'Income'
},
incomeDate: {
date: Date,
//add missing ()
default: Date.now()
}
},
});
//You don't need exports for schemas
mongoose.model('User', userSchema)
//Income model file
const mongoose = require('mongoose')
const Schema = mongoose.Schema
const incomeSchema = new Schema({
income: {
type: Number
},
//No need of ref to the user collection.
//Plus if you can't really have two doc referencing one another is this way,
//there is going to be a problem regarding which one should be created first.
//Even if the above problem is solved. You will still need to run a update
//operation to populate the first document created with the id of the 2nd document
});
//You don't need exports for schemas
mongoose.model('Income', incomeSchema)
//The controller file
//Dependency
const mongoose = require('mongoose');
//Connect to the DB
const options={
useNewUrlParser: true,
useUnifiedTopology: true,
useFindAndModify: false
}
const db = mongoose.createConnection('url', options);
db
.once('open', () => dblog.info('DB Connected'))
.catch(err => dblog.error('Error Connecting to DB' + ' ' + err));
//Load the models
require('../models/user.model');
require('../models/income.model');
const userBD = db.model('User');
const incomeDB = db.model('Income');
//Create new income doc.
module.exports.createIncome = (req, res) => {
const income = {
income: 2000,
};
new incomeDB(income)
.save()
.then(() => res.json({ msg: 'Income Doc. Updated / Created' }))
.catch(err => {
console.log(err);
res.json({ msg: 'Error Updating / Creating Income Doc.' });
})
};
//Create new user doc.
module.exports.createUser = (req, res) => {
//Query the income db
incomeDB.find({ income: 2000 })
.then(income => {
//Create the user object to be stored
const newUser = {
//Assuming you get the information from a html form of some sort
username: req.body.userName,
website: {
sitename: req.body.siteName,
//In order to use .populate() you have to store the id of the income doc here
income: income._id,
},
};
//Save the user object into the user db
new userBD(newUser)
.save()
.then(() => res.json({ msg: 'New User Created' }))
.catch(err => {
console.log(err);
res.json({ msg: 'Error Creating New User' });
});
})
.catch(err => {
console.log(err);
res.json({ msg: 'Error Querying Income DB' });
});
};
//Get user doc.
module.exports.getUser = (req, res) => {
//Query the user db using user name for example
userBD.find({ username: 'StackOverflow Admin' })
//Populate the income field in the website object
.populate('website.income')
//Pass the user data into the response
.then(userData => res.json(userData))
.catch(err => {
console.log(err);
res.json('Error Looking Up DB');
});
};