【问题标题】:mongoose - ObjectId that references a Sub-Documentmongoose - 引用子文档的 ObjectId
【发布时间】:2014-09-11 06:24:21
【问题描述】:

ModelA 中的 ObjectId 是否可以引用子文档 在模型B中?

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

【问题讨论】:

    标签: node.js mongodb mongoose subdocument


    【解决方案1】:

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


    选项 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 作为模型或子文档。

    【讨论】:

    • 第一个解决方案对我不起作用。在我的例子中,模型 B 和 C 是相同的(Userfriends 中有一个友谊列表,并且每个友谊都引用了它的其他方向对应部分)。我明白了:MissingSchemaError: Schema hasn't been registered for model "User.friends".
    • 我也面临与@S0lll0s 相同的问题。选项 1 似乎不起作用。
    • @ramdog 我仍然没有找到允许我填充子文档自引用的解决方案,我只是使用“空白”ObjectId 并自己搜索它。如果您发现了什么,请告诉我,但我很想相信(目前)还没有解决方案。
    • @S0lll0s - 感谢您的更新。我实际上认为还有其他原因导致我的场景出现这种误导性错误 - 我试图使用 NPM 模块 mongoose-id-validator (npmjs.com/package/mongoose-id-validator)。你也有机会使用它吗?我删除了该插件的使用,上面的选项 1 确实有效。
    • @sabari - 不。如果您想对该主题进行更长时间的讨论:github.com/Automattic/mongoose/issues/2772
    【解决方案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);
    })

    【讨论】:

    • 我有一个稍微不同的场景: 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('HOW_TO_POINT_TO_beta_inA_HERE ??'); console.log(res); });如何在 subPopulate 中指向 beta_inA?
    猜你喜欢
    • 2017-07-17
    • 2014-07-01
    • 1970-01-01
    • 2020-05-22
    • 2020-12-26
    • 2019-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多