mongoose - 引用子文档的 ObjectId

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);  
2个回答

23

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


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

选择二:以C作为模型

(我仅提供此作为备选方案——因为您的示例似乎是冗余的,因为您将'C'创建为单独的模型以及子文档)

或者,将它们作为单独的集合可能更有意义,您可以为每个创建一个mongoose模型。每个都将成为一个单独的集合:

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作为模型还是子文档。


15
第一种解决方案对我无效。在我的情况下,模型B和C是相同的(User具有friends中朋友列表,并且每个朋友关系都引用其其他方向的计数器部分)。我遇到了这个问题:MissingSchemaError: Schema hasn't been registered for model "User.friends" - s-ol
1
我也遇到了和 @S0lll0s 相同的问题。选项1似乎不起作用。 - ramdog
1
@S0lll0s - 感谢您的更新。实际上,我认为还有其他原因导致了我的情况中这个误导性的错误 - 我试图使用NPM模块mongoose-id-validator(https://www.npmjs.com/package/mongoose-id-validator)。你也碰巧在使用它吗?我删除了该插件的使用,上述第一种选项确实有效。 - ramdog
1
@ramdog,您在帖子中描述的选项1是否适用于您?如果是,请在此处发布一个示例。抱歉,我不敢开始新线程,因为我没有在任何地方看到这种答案。所以我想联系您。我遇到了“模式未注册模型”的错误。请帮忙。谢谢。Sabari - sabari
1
@sabari - 不行。如果你对这个话题有更长的讨论感兴趣:https://github.com/Automattic/mongoose/issues/2772。 - ramdog
显示剩余2条评论

4

虽然已经过去了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);
})


我有一个稍微不同的场景:var B = new Schema({ c: { alpha: { beta: [BETA] }}});var A = new Schema({ l1: { l2: { beta_inA: { type: ObjectId, subRef: 'ModelB.c.alpha.beta' }}}}); Model_A.findById(_id,async (error, res)=>{ await res.subPopulate('如何在此处指向beta_inA?'); console.log(res); }); - kamran alam

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