2013-08-29 15 views
9

Podoba mi się walidacja, która przychodzi z mangustą. Próbujemy ustalić, czy chcemy z niego korzystać, i znosić koszty ogólne. Czy ktokolwiek wie, czy udostępnia odwołanie do kolekcji nadrzędnej podczas tworzenia schematu mangusty (w schemacie podrzędnym, określ identyfikator obiektu obiektu nadrzędnego jako pole), oznacza to, że za każdym razem, gdy próbujesz zapisać dokument, sprawdza kolekcję nadrzędną pod kątem istnienia identyfikatora obiektu referencyjnego?Czy Mongoose rzeczywiście potwierdza istnienie identyfikatora obiektu?

Odpowiedz

17

Robię to z middleware, przeprowadzić wyszukiwanie elementu na walidacji:

ExampleSchema = new mongoose.Schema({ 

    parentId: { 
     type: mongoose.Schema.Types.ObjectId, 
     ref: 'Example' 
    } 

}); 

ExampleModel = mongoose.model('Example', ExampleSchema); 

ExampleSchema.path('parentId').validate(function (value, respond) { 

    ExampleModel.findOne({_id: value}, function (err, doc) { 
     if (err || !doc) { 
      respond(false); 
     } else { 
      respond(true); 
     } 
    }); 

}, 'Example non existent'); 
2

Nie, pole ObjectId zdefiniowane w schemacie jako odniesienie do innej kolekcji nie jest zaznaczone jako istniejące w zbiorze odniesień do składowania. W razie potrzeby można to zrobić w oprogramowaniu Mongoose.

+0

To ma sens. Przechodzimy z wydajnością, zakładając, że właściwie kodujemy i NIE wpisalibyśmy identyfikatora obiektu niebędącego. To oczywiście ma swoje własne ryzyko, ale przepisujemy java na węzeł, aby dopasować się do reszty naszej architektury, i mam nadzieję, że rozwiążemy poważne problemy z wydajnością, które mieliśmy. – CargoMeister

10

Używam mongoose-id-validator. Działa dobrze

var mongoose = require('mongoose'); 
var idValidator = require('mongoose-id-validator'); 

var ReferencedModel = new mongoose.Schema({name: String}); 

var MySchema = new mongoose.Schema({ 
    referencedObj : { type: mongoose.Schema.Types.ObjectId, ref: 'ReferencedModel'}, 
    referencedObjArray: [{ type: mongoose.Schema.Types.ObjectId, ref: 'ReferencedModel' }] 
}); 

MySchema.plugin(idValidator); 
+0

Podoba mi się to. Ładne i proste. – CargoMeister

1

Można spróbować https://www.npmjs.com/package/lackey-mongoose-ref-validator (jestem dewelopera)

Zapobiega to także usunięcie jeżeli odwołanie jest używany w innym dokumencie.

var mongooseRefValidator = require('lackey-mongoose-ref-validator'); 
mongoSchema.plugin(mongooseRefValidator, { 
    onDeleteRestrict: ['tags'] 
}); 

Jest to wczesna wersja, więc niektóre błędy są oczekiwane. Po prostu wypełnij zgłoszenie, jeśli je znajdziesz.

Powiązane problemy