2015-06-28 11 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); 
    }) 
}