2014-07-13 12 views
6
var mongoose = require('mongoose'); 
mongoose.connect('mongodb://localhost/test', {user: 'mongod'}); 
mongoose.connection.once('open', function() { 

ich erstelle ein Modell mit einem Feld und streng: falseundefiniert Modellfelder mit `streng: false`

var Foo = mongoose.model('Foo', mongoose.Schema({ 
    foo: String 
    }, {strict: false})); 

Dann lesen

Foo.create({foo: "FOO", bar: "BAR"}, function() { 

Dann ist es ein Modell mit zwei Feldern speichern und drucke es mit seinen Feldern

Foo.findOne(function (err, f) { 
     console.log(f, f.foo, f.bar); 
    }); 

    }); 
}); 

Der Ausgang ist { foo: 'FOO', bar: 'BAR', _id: 53c249e876be58931f760e70, __v: 0 }, 'FOO', undefined. Das neue Element ist korrekt gespeichert und console.log kann 'BAR' sehen, aber ich kann nicht. Sobald ich dem Schema einen Balken hinzufüge, kann ich es auch sehen. Ist das beabsichtigtes Verhalten? Wie kann ich bar erreichen, ohne es in das Schema aufzunehmen?

+1

Ich weiß, ich könnte mein Schema als 'definieren {jeder: {}}', dann erstellen '{jeder: {foo:" FOO ", bar:" BAR "}}' und drucke 'f.any, f.any.foo, f.any.bar'. Ich würde das Extrafeld lieber nicht haben. –

+0

Wenn Sie {any: {}} verwenden, müssen Sie alle zuvor im Objekt gespeicherten Daten speichern, wenn Sie sie beim Aktualisieren des Objekts nicht verlieren möchten. – isanjosgon

Antwort

5

Sie Felder in Ihrem Schema mit get nicht definiert zugreifen:

Foo.findOne(function (err, doc) { 
    console.log(doc, doc.foo, doc.get('bar')); 
}); 

Ausgang:

{ _id: 53c28dad3b2464566cf5672d, foo: 'FOO', bar: 'BAR' } 'FOO' 'BAR' 

Das bar Feld zeigt auch auf, wenn doc als inspect Methode eines Mongoose Dokument Protokollierung gibt alle Felder aus.

0

Sie können auf _doc mit

Beispiel: doc._doc.fieldname