Заполните вложенный объект Mongoose с вложенным объектом
Работаю над моим первым проектом, и я был поставлен в тупик на пару дней.
Я пытаюсь заполнить объект, который содержит информацию о пивоваренном заводе и одно соответствующее пиво из модели пива.
models.js
var mongoose = require('mongoose'),
Schema = mongoose.Schema;
var beerSchema = Schema({
breweryName: String,
beer: [{
beerName: String
}]
});
var draftlistSchema = Schema ({
userName: String,
tap: [{
tapNo: Number,
_tapBeer: { type: Schema.Types.ObjectId, ref: 'Beer' },
tapStatus: String
}]
});
var Draftlist = mongoose.model('Draftlist', draftlistSchema);
var Beer = mongoose.model('Beer', beerSchema);
module.exports = {
Draftlist: Draftlist,
Beer: Beer
}
route.js
var getDraftlist = function(user, callback) {
models.Draftlist.findOne({ 'userName': user }).populate( {
path: 'tap._tapBeer',
model: 'Draftlist'
}).exec(function(err, draftlist) {
// console.log(draftlist.tap)
console.log(draftlist);
callback(draftlist);
});
};`
Я получаю нулевое значение с текущим кодом. В идеале я хотел бы, чтобы возвращаемый объект выглядел примерно так:
{
breweryName: Some Brewery,
beer: {// Beer object that was referenced by Id //}
}
Объект черновика с нулевым возвратом
{ _id: 590bd0615a190204fca6d467,
userName: 'A New User1',
__v: 1,
tap:
[ { tapNo: 1,
_tapBeer: null,
tapStatus: 'onTap',
_id: 590bd0615a190204fca6d46d },
{ tapNo: 2,
_tapBeer: null,
tapStatus: 'onTap',
_id: 590bd0615a190204fca6d46c },
{ tapNo: 3,
_tapBeer: null,
tapStatus: 'onTap',
_id: 590bd0615a190204fca6d46b },
{ tapNo: null,
_tapBeer: null,
tapStatus: 'Cellar',
_id: 590bd0615a190204fca6d46a },
{ tapNo: null,
_tapBeer: null,
tapStatus: 'Cellar',
_id: 590bd0615a190204fca6d469 },
{ tapNo: null,
_tapBeer: null,
tapStatus: 'Cellar',
_id: 590bd0615a190204fca6d468 },
{ _tapBeer: null,
tapStatus: 'Cellar',
_id: 590bd0735a190204fca6d470 } ] }
Пивной объект
{ breweryName: 'Beachwood',
_id: 590bd3f1ed13510514405cba,
beer: [ { beerName: 'IPA', _id: 590bd3f1ed13510514405cbb } ] }
1 ответ
Используйте мангуста-глубоко заселить
const
mongoose = require('mongoose'),
deepPopulate = require('mongoose-deep-populate')(mongoose);
Schema = mongoose.Schema;
const
BeerSchema = Schema({
breweryName: Schema.Types.String,
beer: [{
beerName: Schema.Types.String
}]
}),
DraftlistSchema = Schema ({
userName: Schema.Types.String,
tap: [{
tapNo: Schema.Types.Number,
_tapBeer: {
type: Schema.Types.ObjectId,
ref: 'Beer'
},
tapStatus: Schema.Types.String
}]
});
DraftlistSchema.plugin(deepPopulate);
var Draftlist = mongoose.model('Draftlist', DraftlistSchema);
var Beer = mongoose.model('Beer', BeerSchema);
module.exports = {Draftlist, Beer};
использование:
const getDraftlist = (userName, callback) => {
models
.Draftlist
.findOne({
userName
})
.deepPopulate('tap._tapBeer')
.exec((err, draftlist) => {
console.log(draftlist);
callback(draftlist);
});
};
или же:
const Draftlist = models.Draftlist;
const getDraftlist = (userName, callback) => {
Draftlist
.findOne({
userName
})
.exec((err, draftlist) => {
Draftlist
.deepPopulate(
draftlist, 'tap._tapBeer',
(err, draflist) => {
console.log(draftlist);
callback(draftlist);
});
});
};