13

ModelA中的 ObjectId是否可以引用 modelB中的子文档?

var C = new Schema({...});  
var B = new Schema({c: [C]});  
var A = new Schema({c: { type: ObjectId, ref: 'ModelB.ModelC' });  

var Model_A = mongoose.model('ModelA', A);  
var Model_B = mongoose.model('ModelB', B);  
var Model_C = mongoose.model('ModelC', C);  
4

2 回答 2

22

是的,这是可能的,但您有几个选择。


选项 1:C 作为子文档

如果你真的想使用子文档,你不需要创建一个单独的模型。您需要更改对“c”数组的引用。

var C = new Schema({...});  
var B = new Schema({c: [C]});  
var A = new Schema({c: { type: ObjectId, ref: 'ModelB.c' });  

var Model_A = mongoose.model('ModelA', A);  
var Model_B = mongoose.model('ModelB', B); 

选项 2:C 作为模型

(我只将此作为替代方案 - 因为您的示例似乎是多余的,因为您将“C”创建为单独的模型以及子文档)

或者,拥有单独的集合可能是有意义的,您可以为每个集合创建一个猫鼬模型。每个都将是一个单独的集合:

var Model_A = mongoose.model('ModelA', A);  
var Model_B = mongoose.model('ModelB', B);  
var Model_C = mongoose.model('ModelC', C);

在这种情况下,您可能希望直接引用每个模型:

var C = new Schema({...});  
var B = new Schema({c: { type: ObjectId, ref: 'ModelC' }});  
var A = new Schema({c: { type: ObjectId, ref: 'ModelC' }); 

要点

是的,它有可能,但是您需要选择是否要将 C 作为模型或子文档。

于 2014-11-12T17:51:21.753 回答
2

已经 7 年了,但我遇到了同样的问题,我发现插件mongoose-sub-references-populate来填充子文档。

const subReferencesPopulate = require('mongoose-sub-references-populate');

var B = new Schema({c: [C]});  
var A = new Schema({c_inA: { type: ObjectId, subRef: 'ModelB.c' });  

A.plugin(subReferencesPopulate);
var Model_A = mongoose.model('ModelA', A);  
var Model_B = mongoose.model('ModelB', B);  

Model_A.findById(_id,async (error, res)=>{
  await res.subPopulate('c_inA');
  console.log(res);
})

于 2021-05-03T16:40:59.820 回答