0
我目前正在尝试学习如何使用来自关系数据库背景的NoSQL。在这个项目中,我使用Express和Mongoose。Mongoose:合并两个互相引用的文档
由于我试图将两个模型合并在一起,它们之间互相引用,我在回调中挣扎。我试图编辑一组模型(Ribbits)中的每个项目以包含另一个模型(发布Ribbit的用户)的属性。由于找到与Ribbit相关的用户的调用是异步的,我无法返回编辑的Ribbits(带有用户信息)的集合。
在我的网站,我有ribbits(a.k.a. tweets)属于用户。用户可以有很多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);