Mongoose:合并两个相互引用的文档

时间:2015-06-28 23:12:54

标签: javascript node.js mongodb express

我目前正在尝试学习如何使用NoSQL,来自关系数据库背景。在这个项目中,我使用Express和Mongoose。

当我尝试将两个模型合并在一起时,我正在努力应对回调,这两个模型相互引用。我正在尝试编辑一组模型(Ribbits)中的每个项目以包含另一个模型(发布Ribbit的用户)的属性。因为查找与Ribbit关联的用户的调用是异步的,所以我无法返回已编辑的Ribbits集合(带有用户信息)。

在我的网站上,我有属于用户的ribbits(a.k.a。推文)。用户可以拥有多个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 个答案:

答案 0 :(得分:1)

如果我理解正确,您可以在此方案中使用Mongoose populate方法:

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