2015-06-28 38 views
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); 

回答

1

如果我理解正確的話,你可以使用貓鼬populate方法對於這種情況:

ribbitSchema.statics.getAllRibbits = function(cb) { 
    this.find({}).populate('owner').exec(function(err, ribbits){ 
    console.log(ribbits[0].owner) 
    return cb(err, ribbits); 
    }) 
}