我目前正在尝试学习如何使用NoSQL,来自关系数据库背景。在这个项目中,我使用Express和Mongoose。
当我尝试将两个模型合并在一起时,我正在努力应对回调,这两个模型相互引用。我正在尝试编辑一组模型(Ribbits)中的每个项目以包含另一个模型(发布Ribbit的用户)的属性。因为查找与Ribbit关联的用户的调用是异步的,所以我无法返回已编辑的Ribbits集合(带有用户信息)。
在我的网站上,我有属于用户的ribbits(a.k.a。推文)。用户可以拥有多个ribbits。在我的一个页面中,我想列出服务上的所有ribbits,以及与发布该ribbit的用户相关的一些信息。
我找到的一个解决方案是嵌入式文档,但我发现在我的情况下,这仅限于显示属于用户的ribbits。在我的情况下,我想首先获取所有的ribbits,然后,对于每个ribbit,附上有关谁发布的信息。
理想情况下,我希望我的架构函数返回一个Ribbit对象数组,以便我可以在我的视图中渲染它。
// models/user.js
var mongoose = require('mongoose'),
Schema = mongoose.Schema;
var userSchema = Schema({
username: String,
email: String,
password: String,
name: String,
profile: String,
ribbits: [{
type: Schema.Types.ObjectId,
ref: 'Ribbit',
}]
});
module.exports = mongoose.model('User', userSchema);
// models/ribbit.js
var mongoose = require('mongoose'),
Schema = mongoose.Schema,
User = require('./user');
var ribbitSchema = Schema({
content: { type: String, maxlength: 140 },
created: { type: Date, default: Date.now() },
owner: { type: Schema.Types.ObjectId, ref: 'User' },
});
ribbitSchema.methods.getOwnerObj = function(cb) {
return User.findOne({ _id: this.owner }, cb);
}
ribbitSchema.statics.getAllRibbits = function(cb) {
this.find({}, function(err, ribbits) {
console.log('Before Transform');
console.log(ribbits);
ribbits.forEach(function(ribbit) {
ribbit.getOwnerObj(function(err, owner) {
ribbit = {
content: ribbit.content,
created: ribbit.created,
owner: {
username: owner.username,
email: owner.email,
name: owner.name,
profile: owner.profile,
}
};
});
});
});
}
module.exports = mongoose.model('Ribbit', ribbitSchema);
答案 0 :(得分:1)
如果我理解正确,您可以在此方案中使用Mongoose populate方法:
ribbitSchema.statics.getAllRibbits = function(cb) {
this.find({}).populate('owner').exec(function(err, ribbits){
console.log(ribbits[0].owner)
return cb(err, ribbits);
})
}