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);