问题是我有两个不同的模式可以代替Conversation
模型中的用户属性,我该如何表示。可能是Student
发送消息的User
或发送消息的 var mongoose = require('mongoose');
var schema = mongoose.Schema({
message: { type: String, required: true },
user: { type: ObjectId, ref: 'User' /* I want a Student to also be a ref */ }
}, {
timestamps: true
});
var model = mongoose.model('Conversation', schema);
module.exports = { model, schema };
,请注意学生和用户是不同的模型/架构。
.validationWrapper .ui-dialog-titlebar.ui-corner-all {
font-size: 16px;
background: #f86161;
color: #fff;
border-bottom: 1px solid #e04343;
}
.validationWrapper {
font-size: 14px !important;
font-weight: 800 !important;
max-width: 450px;
height: 250px !important;
top: 46% !important;
right: 8.2% !important;
left: auto !important;
background: #fff !important;
}
.validationWrapper:after {
width: 15px;
height: 15px;
position: fixed;
transform: rotate(45deg);
top: 48%;
z-index: 1;
right: 7.85%;
background-color: #f86161;
content: "";
box-shadow: -1px -1px 3px rgba(0,0,0,.15);
}
@media (max-width: 768px) {
body.ios7 .validationWrapper {
max-width: 441px !important;
height: 250px !important;
top: 16% !important;
right: 20.2% !important;
left: auto !important;
}
body.ios7 .validationWrapper:after {
background-color: #f86161;
top: 161px;
left: 26%;
}
}
如何更好地表示或编写此架构/模型
答案 0 :(得分:1)
您可以使用mongoose 动态参考。这样您就可以同时从多个集合中填充。
您只需在架构的路径上使用refPath
属性而不是ref
:
var schema = mongoose.Schema({
message: { type: String, required: true },
author: {
type: { type: String, enum: ['user','student'] },
data: { type: ObjectId, refPath: 'author.type' }
},{
timestamps: true
});
因此上面的refPath
属性意味着mongoose会查看会话模式中的author.type
路径,以确定要使用的模型。
因此,在您的查询中,您可以填充对话的作者:
Conversation.find({}).populate('author.data').exec(callback);
您可以在documentation page for population(靠近底部)和this pull request中找到更多信息。
替代方案:猫鼬鉴别器
根据您的用户和学生模型的相关程度,您还可以使用discriminators来解决此问题。鉴别器是一种模式继承机制。基本上,它们使您能够在相同的基础MongoDB集合之上拥有多个具有重叠模式的模型。
使用鉴别器时,最终会得到基本架构和鉴别器架构。例如,您可以使user
成为您的基本架构,student
是用户的判别器架构:
// Define user schema and model
var userSchema = new mongoose.Schema({ name: String });
var User = mongoose.model('User', userSchema);
// Define student schema and discriminate user schema
var studentSchema = new mongoose.Schema({ level: Number });
var Student = User.discriminator('Student', studentSchema);
现在,您的学生模型将继承用户的所有路径(因此它也具有name属性)并将文档保存到同一个集合中。因此,它也适用于您的引用和查询:
// This will find all users including students
User.find({}, callback);
// This will also find conversations no matter if the referenced user is a student or not
Conversation.find({ user: someId }, callback);