У меня есть приложение, в котором один документ хочет ссылаться на другой документ, но загвоздка в том, что другие документы могут находиться в двух разных коллекциях. есть ли способ сделать это, учитывая, что мне придется заполнять их, когда они будут извлечены.
const schemaOne = new Schema({
name: string,
// other fields
})
const schemaTwo = new Schema({
name: string
// other fields
})
const schemaThree = new Schema({
// I want to reference a document from schemaOne or two in one field
someId: ObjectId,
})
Решение, которое я не пытаюсь сделать, — это создать два поля: одно для SchemaOne, а другое для SchemaTwo. но я думаю, что это создаст больше сложности.
Вы можете использовать refPath . Это позволяет вам иметь поле schemaThree
, в котором указывается, какую модель использовать при заполнении.
const schemaThree = new Schema({
someId: {
type: Schema.Types.ObjectId,
refPath: 'modelNameSpecifier', //< this is used during populate()
},
modelNameSpecifier: {
type: String,
required: true,
enum: ['ModelOne', 'ModelTwo']
}
});
const docs = await ModelThree.find({}).populate('someId');
Когда вы создаете документ с помощью ModelThree
, просто убедитесь, что вы сохранили ObjectId
в поле someId
той схемы, которая связана с этим Objectid
в modelNameSpecifier
, как ModelOne
для schemaOne
или ModelTwo
для schemaTwo
.