猫鼬可能的循环引用

时间:2016-07-04 17:37:04

标签: angularjs node.js mongodb mongoose

当我需要保存文档时,我遇到循环依赖问题。

我的应用程序是通过AngularJS的界面Restfull。

在创建公司的屏幕上,您可以创建对象和服务。在创建“服务”屏幕时,它必须关联创建的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);

1 个答案:

答案 0 :(得分: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中定义。