2016-12-26 114 views
0

我已經定義了一個名爲「foo」的文檔類如下複製文檔,在foo.js與貓鼬

var mongoose = require('mongoose'); 

var fooSchema = mongoose.Schema({ 
user_id: String, 
created_at: { type: Date, default: Date.now }, 
flag: { type: Boolean, default: false }, 
etc: Number, 
}); 

module.exports = mongoose.model('foo', fooSchema); 

,並在我的路由器,我想實例化一個對象,並且,一個精確副本(created_at可能會有所不同,沒有問題:)),只更改flag字段。所以我有兩個副本,一個是「flag」,一個是「not flag」。嘗試這個沒有按預期工作:

var Foo = require('../models/foo'); 
var myObj = new Foo(); 
myObj.user_id = req.user._id; 
myObj.etc = 42; 
myObj.save(function(err) { 
    if (err) throw err; 
    // // also create a "flag" copy 
    // non-working code: 
    var myObj2 = myObj; 
    myObj2.flag = true; 
    myObj2.save(function(err) { 
     if (err) throw err; 
     console.log("this does not create a new item"); 
    }); // myObj2.save(); 
    // working code: 
    var myObj2 = new Foo(); 
    myObj2.user_id = myObj.user_id 
    myObj2.etc = myObj.etc; 
    myObj2.flag = true; 
    myObj2.save(function(err) { 
     if (err) throw err; 
     console.log("this works"); 
    }); // myObj2.save(); 
}); // myObj.save(); 

那麼var myObj2 = myObj;有什麼問題?它通過參考傳遞嗎?如果是這樣,我怎麼能通過價值?我是否需要定義一個特殊的構造函數,將現有的項目作爲參數,以便我可以撥打var myObj2 = new Foo(myObj);?或者我可以用任何其他方式複製現有項目而不復制這麼多代碼?

謝謝,

回答

0

1.是的,你傳遞參考的方式。

2.you可以嘗試myObj2 = myObj.toObject();然後Foo.create(myObj2);,但你可能有一個重複鍵錯誤,原因是相同的_id的obj和obj2的份額

+0

謝謝!如果我刪除'myObj2._id',MongoDB會在'myObj2.save();'中爲我創建一個有效的密鑰嗎? – jeff

+0

事實上,在myObj2 = toObject()不包含s​​ave()方法後,因爲它是一個普通的js對象。但是當你調用'Foo.create(myObj2)'時,它返回的對象就是Foo模型的一個實例。所以,是的,在Foo.create之前刪除_id,它會爲你生成一個有效的_id。 – YLS

+0

太棒了!還有一個最後的問題; '.create()'本身存在,還是我需要在'foo.js'中定義它?謝謝, – jeff