2016-03-29 7 views
0
ausblenden

Ich habe ein Benutzerschema mit einem aktivierten Feld des booleschen Typs. Ich möchte, dass Abfragen nur Dokumente zurückgeben, die activated: true haben. Und ich hoffe, dass es einen effizienteren und trockeneren Weg gibt, als eine Bedingung für jeden Fund, findOne oder findById hinzuzufügen.MongooseJS: Bestimmte Dokumente aus der Abfrage

Was wäre der effektivste Ansatz?

+0

die trockene Art und Weise scheint der beste Weg zu sein. – AJS

Antwort

1

während es kann ein Weg sein, dies zu tun, ist es ist generell eine schlechte Idee zu immer verstecke diese Information.

Wenn Sie aus Erfahrung damit versuchen, dies mit anderen Sprachen und Datenbanksystemen zu tun, werden/wollen Sie irgendwann Elemente laden, die nicht aktiv sind. Aber wenn Sie immer und nur aktivierte Elemente zurückgeben, werden Sie nie in der Lage sein, die Liste zu bekommen, die Sie brauchen.

für Ihre Zwecke, würde ich empfehlen, ein findActive Methode auf Ihrem Schema zu erstellen:


someSchema.static("findActive", function(query, cb){ 
    // check if there is a query and callback 
    if (!cb){ 
    cb = query; 
    query = {}; 
    } 

    // set up an empty query, if there isn't one provided 
    if (!query) { query = {}; } 

    // make sure you only load activated items 
    query.activated = true; 

    // run the query 
    this.find(query, cb); 
}); 

mit dieser Methode haben Sie eine findActive Verfahren das gleiche wie findOne, aber es wird immer für aktivierte Elemente filtern.

MyModel.findActive(function(err, modelList){ ... });

und unterstützt optional zusätzliche Abfragefilter

MyModel.findActive({some: "stuff"}, function(err, modelList){ ... });

+0

"Wenn man aus Erfahrung heraus versucht, dies mit anderen Sprachen und Datenbanksystemen zu tun, will/will man irgendwann Elemente laden, die nicht aktiv sind." Das ist ein sehr gutes Argument, um mich zu überzeugen, Ihren Ansatz zu verwenden. Durch Hinzufügen eines booleschen Arguments als zweites Argument kann ich die Funktion findOne mitteilen oder alle Dokumente finden, die der Abfrage entsprechen. Vielen Dank. – igreka

1

Sie könnten Mongoose aussehen wollen Query middlewarehere

Query-Middleware für das folgende Modell und Query Funktionen unterstützt wird.

  • Zählung
  • finden
  • FindOne
  • ...

Zum Beispiel:

User.pre('find', function() { 
    console.log(this instanceof mongoose.Query); // true 
    this.activated = true; 
}); 
+0

ist es nicht dasselbe wie db.user.find ({activated: true}), was er vermeiden will? – AJS

+0

@AJS Das Ziel ist es, dies nicht zu jeder Anfrage hinzuzufügen, sondern fügen Sie es irgendwo oben hinzu (um dann automatisch verwendet zu werden). –

+0

Danke für Ihre Eingaben. Ich dachte über den Pre-Hook für Fragen nach. Aber ich müsste einen für jede Abfrage-Hilfsfunktion schreiben, nein? – igreka

Verwandte Themen