2014-11-02 42 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' 
      });