2016-12-26 4 views
0

ich eine Dokumentenklasse namens „foo“ haben wie folgt definiert, in foo.js:Kopieren Dokument mit Mongoose

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); 

und in meinem Router, möchte ich ein Objekt instanziiert, und eine exakte Kopie davon (created_at könnte ein wenig abweichen, kein Problem :)), nur das flag Feld ändern. Also habe ich zwei Kopien, eine mit "flag", eine mit "not flag". Der Versuch, diese wie erwartet nicht funktioniert:

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(); 

Also, was ist falsch mit var myObj2 = myObj;? Geht es als Referenz? Wenn ja, wie kann ich nach Wert übergehen? Muss ich einen speziellen Konstruktor definieren, der ein vorhandenes Element als Argument akzeptiert, sodass ich var myObj2 = new Foo(myObj); aufrufen kann? Oder eine andere Möglichkeit, ein vorhandenes Objekt zu replizieren, ohne so viel Code zu duplizieren?

Danke,

Antwort

0

1.Ja, Sie vorbei Referenz Nachvollzug.

2.you kann myObj2 = myObj.toObject(); versuchen dann Foo.create(myObj2);, aber Sie könnten einen doppelten Schlüsselfehler aufgrund des gleichen _id obj und obj2 Aktie

+0

Dank bekommen! Wenn ich 'myObj2._id' entferne, erstellt MongoDB einen gültigen Schlüssel für mich in' myObj2.save(); '? – jeff

+0

Eigentlich nach 'myObj2 = toObject()' enthält nur die Methode 'save() 'nicht, da es ein einfaches js-Objekt ist. Aber wenn Sie 'Foo.create (myObj2)' aufgerufen haben, ist das zurückgegebene Objekt eine Instanz des Foo-Modells. Also, ja, löschen Sie die _id vor Foo.create und es erzeugt eine gültige _id für Sie. – YLS

+0

Großartig! Und eine letzte Frage; existiert '.create()' nativ, oder muss ich es in 'foo.js' definieren? Danke, – jeff

Verwandte Themen