Mongoose是否支持使用非ObjectId类型引用其他Schema?
Mongoose跨Schema关联引用是否仅支持ObjectId类型
结论先行:Mongoose没有强制要求关联字段必须使用Schema.Types.ObjectId类型,Number、String等其他类型完全可以用来做跨Schema关联引用。
只要满足以下两个核心要求,关联和populate关联查询就能正常运行:
- 关联字段的类型,和被引用模型对应匹配字段的类型保持完全一致
- 给关联字段配置
ref属性,值为被引用模型注册时传入的模型名称
用法示例
比如我们需要用Number类型的分类ID做关联,先定义分类模型,用Number作为主键类型:
const mongoose = require('mongoose'); const Schema = mongoose.Schema; // 分类模型,_id使用Number类型存储分类编码 const categorySchema = new Schema({ _id: Number, categoryName: String, level: Number }); const Category = mongoose.model('Category', categorySchema);
之后定义商品模型时,关联分类的字段直接使用Number类型,配置ref即可,用法和ObjectId关联没有区别:
const productSchema = new Schema({ productName: String, price: Number, stock: Number, // 关联分类字段,类型和Category的_id一致为Number categoryId: { type: Number, ref: 'Category' } }); const Product = mongoose.model('Product', productSchema);
后续做关联查询时,直接调用populate即可正常拿到关联的分类数据:
// 查询商品同时关联查出对应分类信息 const productList = await Product.find().populate('categoryId');
额外说明
- 大家平时默认用
ObjectId做关联,只是因为Mongoose会默认给所有Schema的_id字段生成ObjectId类型的值,属于默认使用习惯,不是框架的强制要求 - 如果关联匹配的不是被引用模型的
_id字段,而是其他自定义字段,不管字段是什么类型,只要在关联配置里补充localField(当前模型的关联字段)和foreignField(被引用模型的匹配字段)即可正常使用
内容的提问来源于stack exchange,提问作者Matheus Sousa
相关产品推荐
相关产品推荐

