mongoose - 引用子文档的ObjectId

时间:2014-07-20 18:06:37

标签: node.js mongodb mongoose subdocument

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);  

2 个答案:

答案 0 :(得分:16)

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


选项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' }); 

The Point

是的,但是你需要选择是否要将C作为模型或子文档。

答案 1 :(得分: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);
})