Mongoose查询从另一个模型填充子文档

时间:2015-03-17 20:23:17

标签: mongoose mongoose-populate

我在SO上看到了一些相关的问题,但我似乎无法为这个问题找到合适的解决方案。以下是我的问题的简化版本:

我有两个简单的模型:usersurf

user模型有一个子文档:boards。它还有另一个属性friends,它是对其他用户的引用数组。

surf模型引用user作为冲浪的所有者,friends作为用户朋友的一部分(即您上网的朋友的朋友) with),有一个引用board_id,它是上述用户子文档的一部分。我没有在Mongoose注册BoardSchema

我对用户和冲浪的所有CRUD操作都运行良好。我正在运行查询以获取给定用户朋友的所有冲浪,当我填充冲浪的friends属性时,如控制器中所示,它可以正常工作。但是,当我尝试使用board_idname填充size时,我收到了猫鼬错误: Schema hasn't been registered for model "User.boards"

user型号:

// user.model.js
var mongoose = require('mongoose');
var Schema = mongoose.Schema;

/**
 * Board Schema
 */
var BoardSchema = new Schema({
  name: String,
  size: String,
  category: String
});

/**
 * User Schema
 */
var UserSchema = new Schema({
  name: String,
  email: { type: String, lowercase: true },
  boards: [BoardSchema],
  friends: [{type: Schema.Types.ObjectId, ref: 'User'}]
});

module.exports = mongoose.model('User', UserSchema);

surf型号

// surf.model.js
var mongoose = require('mongoose');
var Schema = mongoose.Schema;

/**
 * Surf Schema
 */
var SurfSchema = new Schema({
  user_id: {type: Schema.Types.ObjectId, ref: 'User'},
  friends: [{type: Schema.Types.ObjectId, ref: 'User'}],
  board_id: {type: Schema.Types.ObjectId, ref: 'User.boards', required: true},
  comment: {type: String, required: false},
  sessionDate: {type: Date, required: true},
}, {
  collection: 'surfs' // Mongoose pluralizes 'surf' to 'surves', so define explicitly
});

module.exports = mongoose.model('Surf', SurfSchema);

surf控制器

// surf.controller.js
var mongoose = require('mongoose');
var User = require('../user/user.model')
var Surf = require('./surf.model');

exports.feed = function (req, res) {
  var userId = req.user._id;
  var userIds = req.user.friends;

  Surf
    .find({user_id: {$in: userIds}})
    .populate('user_id', 'name email')
    // .populate('board_id', 'name size')
    .populate('friends', 'name email')
    .exec(function (err, surfs) {
      if (err) {
        return handleError(res, err);
      }
      return res.json(200, surfs);
    });
};

控制器中注释掉的.populate('board_id', 'name size')是造成问题的原因。我没有在Mongoose中注册BoardSchema,因为它不是模型的子文档。我需要吗?或者是否有另一种方法来编写此查询以从该用户的主板子文档中填充board?谢谢你的帮助!

1 个答案:

答案 0 :(得分:-1)

替换

board: {type: Schema.Types.ObjectId, ref: 'User.boards', required: true},

board: {type: Schema.Types.ObjectId, ref: 'UserBoard', required: true},

它应该有用。

BoardSchema不适用于子文档。它就像一个全新的集合,就像用户集合一样。您所做的只是使用boards属性引用了电路板文档。