ObjectId的Mongoose模型设计有条件地引用集合

时间:2017-03-19 20:46:55

标签: mongodb mongoose mongoose-schema

我很好奇最好的解决方案是如何为这个场景建模我有多种类型的实体可以被单个属性引用。我在THIS POST中看到,创建外键的方法是使用ObjectId类型的属性和对适用模型的引用。所以在我的场景中,我应该有一个String类型的属性,并且有一个索引并省略引用吗?

这是我的意思的抽象例子。说我有3种类型的动物:狗,猫和猪......然后说这些动物中的任何一种都可以去兽医。所以我有一个VetVisit架构,它有一个petId,可以引用狗,猫或猪的_id。我的问题是..我应该如何为petId建模?我做得对吗?请参阅下面的代码示例...

犬:

var mongoose = require('mongoose');

var dogSchema = new mongoose.Schema({
    name: {type: String},
    age: {type: Number}
});

var Dog = mongoose.model('Dog', dogSchema);
module.exports = Dog

猫:

var mongoose = require('mongoose');

var catSchema = new mongoose.Schema({
    name: {type: String},
    age: {type: Number},
    isLongHair: {type:Boolean}
});

var Cat = mongoose.model('Cat', dogSchema);
module.exports = Cat

猪:

var mongoose = require('mongoose');

var pigSchema = new mongoose.Schema({
    name: {type: String},
    isMuddy: {type:Boolean}
});

var Pig = mongoose.model('Pig', pigSchema);
module.exports = Pig

兽医访问:

var mongoose = require('mongoose');

var vetVisitSchema = new mongoose.Schema({
    petType: {
        type: String, // dog, cat, pig
        required: [true,"Pet type is required"]
    },
    petId: {
        type: String, 
        required: [true,"Pet ID is required"]
    },
    date: {
        type: Date,
        required: [true, "Date is required"]
    },
    Reason: {
        type: String,
        required: [true, "Reason is required"]
    }
});

module.exports = vetVisitSchema

1 个答案:

答案 0 :(得分:1)

你的兽医访问:架构似乎对我来说是正确的,但你可以结合你的狗,猫,猪 集合在一个集合中,因为如果您有10只动物,您有多个动物,则无需制作多个集合,您只需定义动物的大小即可,您可以根据动物类型执行任何查询。

    var mongoose = require('mongoose');

    var Animal= new mongoose.Schema({
        name: {type: String},
        petType: {
        type: String, // dog, cat, pig
            required: [true,"Pet type is required"],},
       isLongHair: {type:Boolean}
         isMuddy: {type:Boolean},
                age: {type: Number}
            });

        var Animal= mongoose.model('Animal', animalSchema);
        module.exports = Animal