2013-02-07 51 views
4

在貓鼬中,是否可以在保存被引用文檔時創建引用文檔?我已經嘗試了下面,但它似乎並沒有爲我工作。貓鼬 - 在模型保存中創建參考

var Model1Schema = new Schema({ 
    foo: String, 
    child: { ref: 'Model2', type: ObjectId } 
}); 

var Model2Schema = new Schema({ 
    foo: String 
}); 

mongoose.model('Model1', Model1Schema); 
mongoose.model('Model2', Model2Schema); 

var m = new (mongoose.model('Model1')); 

m.set({ 
    foo: 'abc', 
    child: { 
    bar: 'cba' 
    } 
}).save(); 
+0

嘿@mike其2017年。你知道現在有一些更好的方法來做到這一點嗎?你也有一個錯誤在m.set孩子應該是:{foo:'cba'} –

回答

18

貓鼬驗證不會允許建立子,因爲它是一個參考,所以你能做的就是創建自己的功能,第二最好的東西來創建與該修正的孩子的情況下,這已是保存。類似於這個,我想..

var Model1Schema = new mongoose.Schema({ 
    foo: String, 
    child: { ref: 'Model2', type: mongoose.Schema.ObjectId } 
}); 

var Model2Schema = new mongoose.Schema({ 
    foo: String 
}); 

var Model1 = mongoose.model('Model1', Model1Schema); 
var Model2 = mongoose.model('Model2', Model2Schema); 

function CreateModel1WithStuff(data, cb) { 
    if (data.child) { // Save child model first 
     data.child = Model2(data.child); 
     data.child.save(function(err) { 
      cb(err, err ? null : Model1(data)); 
     }); 
    } else { // Proceed without dealing with child 
     cb(null, Model1(data)); 
    } 
} 

CreateModel1WithStuff({ 
    foo: 'abc', 
    child: { 
     bar: 'cba' 
    } 
}, function(err, doc) { 
    doc.save(); 
}); 
+0

這篇文章是我一直在尋找...值得更多upvotes! –

+3

將是一個很好的保存/更新參考文檔的標準方法。一個POST創建原始模型+引用的情況很常見。 –

+2

.pre('save',function ...)呢? [http://mongoosejs.com/docs/middleware.html](http://mongoosejs.com/docs/middleware.html) – ejramire