mongoose - 引用子文档的ObjectId

Sha*_*ico 10 mongoose mongodb node.js subdocument

是否有可能在一个的ObjectId MODELA以参考子文件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);  
Run Code Online (Sandbox Code Playgroud)

小智 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); 
Run Code Online (Sandbox Code Playgroud)

选项2:C作为模型

(我只是将它作为替代方案 - 因为你的例子似乎是多余的,因为你创建'C'作为一个单独的模型以及一个子文档)

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

var Model_A = mongoose.model('ModelA', A);  
var Model_B = mongoose.model('ModelB', B);  
var Model_C = mongoose.model('ModelC', C);
Run Code Online (Sandbox Code Playgroud)

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

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

是的,但是如果你想要C作为模型或子文档,你需要选择它.

  • 第一个解决方案对我不起作用.在我的情况下,模型B和C是相同的("用户"在"朋友"中有一个友谊列表,每个友谊都有一个对其他方向对应的引用).我明白了:`MissingSchemaError:Schema尚未注册模型"User.friends".` (7认同)