2016-07-04 3 views
0

「文書」を保存する必要があるときに循環依存性に問題があります。マングースで循環参照が可能

私のアプリケーションはすべてAnglesJS経由のインターフェースを備えたRestfullです。

COMPANYを作成する画面で、OBJECTSとSERVICESを作成できます。 SERVICES画面の作成では、作成したOBJECTを関連付ける必要があります。

問題は、作成されたOBJECTがまだ保持されていないため、_idがないことです。したがってSERVICEで参照することはできません。 OBJECTが持続されている場合にのみ、company.services[0].objectに関連付けることができます。

提案がありますか?

これは私がMongoDBに保存する必要があるものです。 SERVICE内のOBJECT "5779f75a27f9d259248211c7"への参照を見てください。

/* 1 */ 
{ 
    "_id" : ObjectId("5749bb92bf8145c97988e4a9"), 
    "name" : "company 1", 
    "services" : [ 
     { 
      "_id" : ObjectId("5764cb2c00d00cf10c9c41c6"), 
      "description" : "service 1", 
      "object" : ObjectId("5779f75a27f9d259248211c7"), 
     } 
    ], 
    "objects" : [ 
     { 
      "_id" : ObjectId("5779f75a27f9d259248211c7"), 
      "description" : "object 1", 
     } 
    ] 
} 

そして、これが私のスキーマです:

var objectSchema = new mongoose.Schema({ 
    description: { 
    type: String, 
    trim: true, 
    unique: true, 
    required: 'Description is required' 
    } 
}) 

var serviceSchema = new mongoose.Schema({ 
    description: { 
    type: String, 
    trim: true, 
    required: 'Description is required' 
    }, 
    object: { 
    type: mongoose.Schema.ObjectId, 
    ref: 'Object' 
    }, 
}) 

var companySchema = new mongoose.Schema({ 
    name: { 
    type: String, 
    default: '', 
    trim: true, 
    unique: true, 
    required: 'Name is required' 
    }, 
    guarda_documentos: { 
    services: [serviceSchema], 
    objects: [objectSchema], 
    }, 
}); 

mongoose.model('Company', companySchema); 
mongoose.model('Object', objectSchema); 

答えて

0

あなたが最初にあなたのオブジェクトを永続化する必要があるとこれが完了すると、その後、あなたのサービスを永続化するために返された_idを使用します。これは非同期処理です。

// Simplified code concept 

// Create a new object 
var o = new Object() 
o.description = 'foo' 
... 

// Create a new service 
var s = new Service() 

// Save object and return it (will now have an _id) 
o.save(function(err, doc) { 

    // Add object reference to service and save 
    s.object = doc._id 
    s.save(function(err, res) { 
    // Call your controller or whatever callback here 
    }) 
}) 

別の注意として、ドキュメントの名前として「オブジェクト」を使用しないでください。すでにJavascriptで定義されています。

+0

問題は、サービスとオブジェクトが会社の副文書であることです。 –

+0

あなたのオブジェクトはサービスでの参照なので、なぜそれを会社の副文書として持っていますか?別の目的がある場合を除いて、ここで説明していない限り、オブジェクトのサブディレクトリを会社から削除します。次に、非同期の同じプロセスに従います。オブジェクトの保存 - >サービスの保存 - >会社の保存 – cyberwombat