ObjectId 条件引用集合的 Mongoose 模型设计
Mongoose model design for ObjectId conditionally referencing collection
我很好奇在我有多种类型的实体可以被单个 属性 引用的场景中如何建模的最佳解决方案是什么。我在 THIS POST 中看到制作外键的方法是使用 属性 类型的 ObjectId 和对适用模型的引用。因此,在我的场景中,我是否应该有一个 属性 类型的字符串,上面有一个索引并省略引用?
这是我的意思的一个抽象示例。假设我有 3 种动物:狗、猫和猪。然后说这些动物中的任何一种都可以去看兽医。所以我有一个 VetVisit 模式,它有一个可以引用狗、猫或猪的 _id 的 petId。我的问题是..我应该如何为 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
您的兽医访问:模式对我来说似乎是正确的,但您可以结合您的狗、猫、猪
一个集合中的集合,因为如果你有 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
我很好奇在我有多种类型的实体可以被单个 属性 引用的场景中如何建模的最佳解决方案是什么。我在 THIS POST 中看到制作外键的方法是使用 属性 类型的 ObjectId 和对适用模型的引用。因此,在我的场景中,我是否应该有一个 属性 类型的字符串,上面有一个索引并省略引用?
这是我的意思的一个抽象示例。假设我有 3 种动物:狗、猫和猪。然后说这些动物中的任何一种都可以去看兽医。所以我有一个 VetVisit 模式,它有一个可以引用狗、猫或猪的 _id 的 petId。我的问题是..我应该如何为 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
您的兽医访问:模式对我来说似乎是正确的,但您可以结合您的狗、猫、猪 一个集合中的集合,因为如果你有 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