2013-01-19 249 views
2

我有2种模式中猫鼬设置:猫鼬嵌套文档

var Job = new mongoose.Schema({ 
    title: String, 
    budget: Number 
}); 

var JobModel = mongoose.model('Job', Job); 

var Customer = new mongoose.Schema({ 
    name: String, 
    jobs: [Job] 
}); 

var CustomerModel = mongoose.model('Customer', Customer); 

客户模型具有工作模式的阵列。

我增加了新的工作如下:

app.post('/api/jobs', function(req, res){ 

    var job = new JobModel({ 
     title: req.body.title, 
     budget: req.body.budget 
    }); 

    job.save(function(err){ 
     if(!err){ 
      CustomerModel.findById(req.body.customerId, function(err, customer){ 
       if(!err){ 
        customer.jobs.push(job); 
        customer.save(function(err){ 
         if(!err){ 
          return console.log('saved job to customer'); 
         } 
        }); 
       } 
      }); 
      return console.log('created job'); 

     } else { 
      return console.log(err); 
     } 
    }); 

    return res.send(job); 
}); 

当我添加一个新的工作,并得到所有我得到的,我认为客户是正确的:

[{ 
    "__v": 1, 
    "_id": "50f85695771aeeda08000001", 
    "name": "Customer1", 
    "jobs": [ 
     { 
     "_id": "50fad6985edd968840000002", 
     "budget": 100, 
     "title": "job1" 
     } 
    ] 
    }, ...] 

现在,如果我更新job1和GET所有作业,作业1已更新(预算现在为500)

[{ 
    "title": "job1", 
    "budget": 500, 
    "_id": "50fad6985edd968840000002", 
    "__v": 0 
    }, ...] 

但是作业1在客户作业数组中保持不变。

[{ 
     "__v": 1, 
     "_id": "50f85695771aeeda08000001", 
     "name": "Customer1", 
     "jobs": [ 
      { 
      "_id": "50fad6985edd968840000002", 
      "budget": 100, 
      "title": "job1" 
      } 
     ] 
     }, ...] 

不要因此我需要搜索customer1表的工作阵列,并找到JOB1工作和更新还我每次更新或删除或时间我完全做整个筑巢东西走错了路?

我得到在客户的作业数组是一个对象数组,但我认为他们可能是一些如何只是一份工作的参考副本而不是重复?

回答

15

如果您在此处使用嵌入式Job文档的阵列,则它们是完全独立的副本,并且由您决定将它们与单独的jobs集合保持同步。

另一种方法是有Customerjobs场包含ObjectId引用'Job'数组,然后用猫鼬的query population填充它们点播,根据需要。

jobs: [{type: Schema.Types.ObjectId, ref: 'Job'}] 
+0

好的,谢谢,这似乎是一个更明智的方式来做到这一点 –