2012-12-06 14 views
5

Oto, co próbuję zrobić.Czy istnieje sposób używania oprogramowania pośredniego Mongoose z narzędziem do tworzenia zapytań?

Używam mongoosejsa w zaufanym środowisku (aka tego, co zostało przekazane, zawsze uważane jest za bezpieczne/wstępnie zatwierdzone) i muszę przekazać mu "wybierz" i "zapełnij" treść potencjalnie przy każdym uruchomionym zapytaniu. Dostaję to w spójny sposób dla każdego wniosku. Chcę zrobić coś takiego:

var paramObject = sentFromUpAbove; // sent down on every Express request 
var query = {...} 
Model.myFind(query, paramObject).exec(function(err, data) {...}); 

Funkcja chciałbym przejść do pośredniczącego lub innego konstruktu jest proste, wystarczy:

function(query, paramObject) { 
    return this.find(query) 
    .populate(paramObject.populate) 
    .select(paramObject.select); 
} 

I to samo dla findOne. Wiem, jak to zrobić, bezpośrednio przedłużając Mongoose, ale to jest brudne. Wolę używać oprogramowania pośredniego lub innego konstruktora, który robi to w czysty i nieco przyszłościowy sposób.

Jestem świadomy, że mogę to osiągnąć za pomocą statyki na podstawie modelu po modelu, ale chciałbym to zrobić uniwersalnie na każdym modelu. Jakakolwiek rada?

+0

Więc najwyraźniej, dodając do prototypu jest sposobem, aby to zrobić. Brudne czy nie, myślę, że nadszedł czas, aby zanurkować. –

Odpowiedz

0

Możesz zrobić coś podobnego do this, ale niestety operacje nie są wywoływane pre i post, więc pomijają oprogramowanie pośrednie.

0

Można to zrobić poprzez stworzenie prostego Mongoose plugin który dodaje myFind i myFindOne funkcje do dowolnego schematu, który chcesz zastosować do:

// Create the plugin function as a local var, but you'd typically put this in 
// its own file and require it so it can be easily shared. 
var selectPopulatePlugin = function(schema, options) { 
    // Generically add the desired static functions to the schema. 
    schema.statics.myFind = function(query, paramObject) { 
     return this.find(query) 
      .populate(paramObject.populate) 
      .select(paramObject.select); 
    }; 
    schema.statics.myFindOne = function(query, paramObject) { 
     return this.findOne(query) 
      .populate(paramObject.populate) 
      .select(paramObject.select); 
    }; 
}; 

// Define the schema as you normally would and then apply the plugin to it. 
var mySchema = new Schema({...}); 
mySchema.plugin(selectPopulatePlugin); 
// Create the model as normal. 
var MyModel = mongoose.model('MyModel', mySchema); 

// myFind and myFindOne are now available on the model via the plugin. 
var paramObject = sentFromUpAbove; // sent down on every Express request 
var query = {...} 
MyModel.myFind(query, paramObject).exec(function(err, data) {...}); 
Powiązane problemy