2016-12-26 113 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