我在SO上看到了一些相关的问题,但我似乎无法为这个问题找到合适的解决方案。以下是我的问题的简化版本:
我有两个简单的模型:user
和surf
。
user
模型有一个子文档:boards
。它还有另一个属性friends
,它是对其他用户的引用数组。
surf
模型引用user
作为冲浪的所有者,friends
作为用户朋友的一部分(即您上网的朋友的朋友) with),还有一个引用board_id
,它是上述用户子文档的一部分。我没有在Mongoose注册BoardSchema
。
我对用户和冲浪的所有CRUD操作都运行良好。我正在运行查询以获取给定用户朋友的所有冲浪,当我填充冲浪的friends
属性时,如控制器中所示,它可以正常工作。但是,当我尝试使用board_id
和name
填充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
?谢谢你的帮助!
答案 0 :(得分:-1)
替换
board: {type: Schema.Types.ObjectId, ref: 'User.boards', required: true},
与
board: {type: Schema.Types.ObjectId, ref: 'UserBoard', required: true},
它应该有用。
BoardSchema
不适用于子文档。它就像一个全新的集合,就像用户集合一样。您所做的只是使用boards
属性引用了电路板文档。