我目前正在尝试从关系数据库背景学习如何使用NoSQL。在这个项目中,我将Express与Mongoose结合使用。
当我尝试将两个相互引用的模型合并在一起时,我在回调方面苦苦挣扎。我正在尝试编辑一个模型(Ribbits)组中的每个项目,以包含另一个模型(发布了Ribbit的用户)的属性。因为查找与Ribbit关联的User的调用是异步的,所以我无法返回已编辑Ribbits的集合(带有用户信息)。
在我的网站上,我拥有属于用户的ribbit(又称tweets)。用户可以有很多肋骨。在我的页面之一中,我想列出该服务上的所有ribbit,以及与发布该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);
最佳答案
如果我理解正确,则可以在这种情况下使用Mongoose populate方法:
ribbitSchema.statics.getAllRibbits = function(cb) {
this.find({}).populate('owner').exec(function(err, ribbits){
console.log(ribbits[0].owner)
return cb(err, ribbits);
})
}
关于javascript - Mongoose :合并两个互相引用的文档,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31105740/