2016-03-29 5 views
3

Ich habe das folgende Schema.Wie Mungo Default-Wert zu beschränken, die nicht in der Datenbank während der Suche()

var UserSchema = new mongoose.Schema({ 
    username: { 
    type: String, 
    unique: true, 
    required: true 
    }, 
    password: { 
    type: String, 
    required: true 
    }, 
    test: { 
    type: String, 
    default: 'hello world' 
    } 
}); 

UserSchema.pre('save', function(callback) { 
    var user = this; 
    this.test = undefined; // here unset test field which prevent to add in db 
}); 

module.exports = mongoose.model('User', UserSchema); 

Aber wenn ich Daten zum Beispiel finden

User.find(function(err, users) { 
    if (err) 
     res.send(err); 

    res.json(users); 
    }); 

es gibt immer

[ 
    { 
     _id: "56fa6c15a9383e7c0f2e4477", 
     username: "abca", 
     password: "$2a$05$GkssfHjoZnX8na/QMe79LOwutun1bv2o76gTQsIThnjOTW.sobD/2", 
     __v: 0, 
     test: "hello world" 
    } 
] 

Wie kann ich eine spezielle param ändern oder fügen Sie Daten ohne test Feld zu bekommen und ohne Änderung in Frage, sagen wir

User.find({}, '-test', function (err, users){ 

}); 

Ich habe auch den Standardwert in Modell: test: "hello world" , aber ich möchte diesen Wert nicht in der Antwort angezeigt werden. Ich habe auch this.test = undefined; gesetzt und dies sollte bedeuten, dass es verhindert, dass dieser Standardwert in die Datenbank hinzugefügt wird, aber ich bekomme immer noch dies als Antwort.

Antwort

1
  1. Sie wollen die test Eigenschaft in der Datenbank beibehalten und es einfach nicht ausgewählt werden soll, wenn die Abfrage:

    UserSchema.pre('find', function (next) { 
        this.select({ test: false }); 
        next(); 
    }); 
    

    In a:

Sie select in einem vorgeFund Haken verwenden können Abfrage-Hook (im Gegensatz zu einem Sicherungs-Hook zum Beispiel), bezieht sich this auf Ihr Abfrageobjekt. Bei einem Speicherabzug bezieht sich dies auf das aktuelle Dokument, das gespeichert wird.

Dieser Haken wird nur für find Abfragen ausgeführt, nicht findById oder findOne Abfragen.

OR

(siehe Hank Chiu Antwort)

stellen Sie die Select-Flag auf false im Schema:

test: { 
     type: String, 
     default: 'hello world', 
     select: false, 
} 
  1. Sie wollen nicht Die test Eigenschaft blieb in der Datenbank:

Entfernen Sie die test ordnungsgemäß ty von Schema und fügen Sie einen test virtuellen:

schema.virtual('test').get(function() { 
    return 'hello world'; 
}); 

user.test wird hello world zurück.

  1. Sie die Testeigenschaft in der Datenbank beibehalten möchten, aber zurückkehren etwas anderes:

hinzufügen getter Ihre test Definition:

test: { 
    type: String, 
    default: 'hello world', 
    get: function() { 
     return 'hello guys'; 
    } 
} 

user.test wird hello guys zurückkehren aber sein wahrer Wert wird in der Datenbank beibehalten.

Alte fehlerhafte Antwort:

Sie können select verwenden, die ein Objekt von Modelleigenschaften als Schlüssel und booleans als Werte annimmt:

User 
    .find({}) 
    .select({ 
     test: false; 
    }) 
    .exec(function (err, users) { 
     // users won't have the test property 
    }); 

+2

Das ist genau das, was '' -test'' tut. Das fragt das OP also nicht. Sie wollen das Feld "automatisch" ausschließen, so dass ** jeder ** '.find()' Aufruf das Feld bereits ausschließt, ohne '' test '' oder '.select ({" test ": false})' 'machen zu müssen oder '.select ({" test ": -1})' (das ist wieder das Gleiche) –

+0

Oh du hast recht. Ich habe den "ohne Änderung in der Abfrage" -Teil vermisst, mein Schlechter. Ich aktualisierte meine Antwort – Komo

+1

Wahrscheinlich sollte beachten, dass [Middleware] (http://mongoosejs.com/docs/middleware.html) wie dies ziemlich spezifisch ist. Du brauchst also auch 'findOne' oder sonst ein' .findOne() 'oder' .findById() 'würde" immer noch "das Feld zurückgeben. Ich frage mich auch, ob das OP nicht die Daten "speichern" möchte, wenn "virtuals" eine bessere Wahl wäre, und sie dann von der Serialisierung ausschließt. Das kann auch gemacht werden. –

1

Stellen Sie Ihr Schema wie

test: { 
    type: String, 
    default: 'hello world', 
    select: false 
} 

Überprüfen Sie die SchemaType#select in der document.

+1

Vielen Dank für Antwort, kann ich „select“ auf bedingter Basis definieren ? –

+0

Was meinst du "auf bedingter Basis"? Sobald 'select: false' definiert ist, können Sie das Attribut mit' select ('+ test') 'bei der Abfrage abrufen. –

+0

Ich habe mehrere Rollen wie Student, Lehrer, Studio. Also, was kann ich tun, um "select" für den Schüler wahr und falsch für den Lehrer zu machen? –

Verwandte Themen