You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 15:36:28