如何在对话中显示两个不同模式之间的关系

时间:2017-02-01 11:51:11

标签: javascript node.js mongodb mongoose database

问题是我有两个不同的模式可以代替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%;
        }
}

如何更好地表示或编写此架构/模型

1 个答案:

答案 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);