我目前正在尝试从关系数据库背景学习如何使用NoSQL。在这个项目中,我将Express与Mongoose结合使用。

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

在我的网站上,我拥有属于用户的ribbit(又称tweets)。用户可以有很多肋骨。在我的页面之一中,我想列出该服务上的所有ribbit,以及与发布该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);

最佳答案

如果我理解正确,则可以在这种情况下使用Mongoose populate方法:

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

关于javascript - Mongoose :合并两个互相引用的文档,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31105740/

10-09 16:41