2014-11-02 41 views
0

我認爲我的文章標題有點模糊。讓我澄清一下。MongoDB和Mongoose:可以在引用文檔創建之前使貓鼬映射引用的文檔?

我有以下模式:

var listSchema = mongoose.Schema({ 
      _owner: { type:ObjectId, ref: 'User' }, 
      title: String, 
      description: String, 
      creation_date: { type: Date, default: Date.now } 
     }); 


     var taskSchema = mongoose.Schema({ 
      _taskList: { type: ObjectId, ref: 'List' }, 
      title: String, 
      description: String, 
      creation_date: { type: Date, default: Date.now } 
     }); 

    var List = mongoose.model('List', listSchema); 
    var Task = mongoose.model('Task', taskSchema); 

每個 '任務' 涉及一個 '清單'。是否可以保存一個新的'任務'引用集合中尚不存在的'List'?例如:

//assume I have a user.id 

    var NewList = new List({ 
        _owner: user._id, 
        title: 'Test List', 
        description: 'List Description' 
       }); 

    var NewTask = new Task({ 
        _taskList : NewList, //ref to the document above (_id not created yet) 
        title: 'Task Title', 
        description: 'Task Description' 

       }); 

    NewTask.save(function(err, task){ 
       ... 
       }); 

是這樣的可能或我需要保存列表然後保存任務?

非常感謝!

+0

這是絕對有可能。您可以手動設置ID。但是你認爲這種方法有問題嗎? 'NewTask.save'完成後'NewList.save'失敗怎麼辦?那麼,一致性是Mongo的一個普遍問題... – freakish 2014-11-02 22:41:15

+0

@freakish當然。我會假設如果引用的文檔save()失敗,那麼這兩個文檔都不會被保存。這是您期望在另一個環境中使用RDBMS ORM的事務行爲。所以據你所知,有必要執行兩次保存事務(以我的例子爲例)?沒關係。就是想。 – Nick 2014-11-02 22:49:17

回答

0

貓鼬實際上爲新的doc客戶端創建了_id值,因此即使在保存之前,您也可以訪問_idNewList

因此,你可以簡單地做:

var NewTask = new Task({ 
       _taskList : NewList._id, 
       title: 'Task Title', 
       description: 'Task Description' 
      });