使用Mongoose/MongoDB,如何在不使用ObjectId的情况下引用另一个Schema?

3

我目前有两个模式。

var carSchema = new mongoose.Schema({
    id: {
        type: Number,
        unique: true,
        required: true
    },
    make: {
        type: String,
        required: true
    },
    model: {
        type: String,
        required: true
    },
    year: {
        type: Number,
        required: true,
        min: config.MIN_YEAR,
        max: config.MAX_YEAR
    },
    color: {
        type: String
    },
    price: [
        // don't know what to put here...
    ],
 });


var priceSchema = new mongoose.Schema({
    car_id: {
        type: Number
    },
    amount: {
       type: Number,
       min: 0
    },
    year: {
       type: Number,
       min: config.MIN_YEAR,
       max: config.MAX_YEAR
    }
 });

从上面的两个模式中可以看出,我正在尝试从汽车模式中引用价格模式。 我知道您可以通过引用ObjectId(_id)来完成此操作,但我需要通过car_id引用价格模式。 原因是因为我正在从已定义表头的CSV文件中读取所有数据。 在mongoose中是否有可能进行此引用?


1
为什么不同时保留car_id_id(新创建的)呢?因为使用其他ID,您将无法从populate中受益。 - Talha Awan
@TalhaAwan 我该如何构建我的模式,以便能够利用car_id_id来引用价格模式?这就是我不太明白的地方。 - calviners
1
当您从CSV文件导入记录并将其转换为价格对象时,您会同时拥有car_id_id(这是mongoose默认输入的)。请将_id输入到车辆价格引用数组中。 - Talha Awan
@TalhaAwan 我最初写的是 price: [ { type: mongoose.Schema.Types.ObjectId, ref: "Price" } ](我认为这就是你告诉我的),但我不知道这怎么能让我引用所有 id == car_id 的价格。 - calviners
我觉得你把汽车和价格的关系搞混了。我的理解是,从CSV文件中,你有一辆汽车在多年间有多个价格?如果是这样的话,你可以将价格嵌入到汽车本身中(我认为不需要价格集合)。 - Talha Awan
1
如果您确实需要一个单独的集合,您可以在汽车中保留价格引用数组,或者在每个价格文档中保留汽车引用。无论哪种方式,引用都应该是Mongo ID。CSV中的car_id可以直接存储在汽车文档中,但您可能不想将其用于引用。 - Talha Awan
3个回答

1
在汽车模式的基础上定义价格模式,然后将价格模式放入您的汽车模式中。
...
color: {
    type: String
},
price: [priceSchema]
...

1
你可以这样做:
var priceSchema = new mongoose.Schema({
    car_id: {
        type: Number
    },
    amount: {
       type: Number,
       min: 0
    },
    year: {
       type: Number,
       min: config.MIN_YEAR,
       max: config.MAX_YEAR
    }
 });

然后将价格的模型制作为:
var Price = mongoose.model('Price', priceSchema);

跟着来的是:
var carSchema = new mongoose.Schema({
    id: {
        type: Number,
        unique: true,
        required: true
    },
    make: {
        type: String,
        required: true
    },
    model: {
        type: String,
        required: true
    },
    year: {
        type: Number,
        required: true,
        min: config.MIN_YEAR,
        max: config.MAX_YEAR
    },
    color: {
        type: String
    },
    price: {
        type: mongoose.Schema.Types.ObjectId, ref: 'Price'
    },
 });

然后将汽车模型设置为:
var Car = mongoose.model('Car', carSchema);

这样就可以解决问题了。然后您可以按如下方式运行查询:
Car.find({_id: 1})
.populate('price')
.exec(function(err, car) {
    // do stuff with your car objects
});

0

我认为这个答案可以通过一个小例子来改进。这样,即使链接的文档过时了,答案仍然是完整的。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接