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 に答える