Zakładając przypadek /login
API, gdzie dla zestawu dopasowującego mandatów, obiekt użytkownika z kolekcji powinien być zwrócony, które podejście byłoby bardziej wydajnych:Czy lepiej oddzielić skomplikowany model mangusty?
1) jeden model z zapytaniami projekcyjnych:
var UserSchema = new Schema({
name : String,
email : String,
dob : Number,
phone : Number,
gender : String,
location : Object, // GeoJSON format {type: 'Point', geometry: { lat: '23.00', lng: '102.23' }}
followers : [UserSchema],
following : [UserSchema],
posts : [PostSchema],
groups : [GroupSchema]
// ... and so on
});
modele 2) dzielone:
var UserMinimalSchema = new Schema({
name : String,
email : String,
phone : Number,
location : Object,
});
var UserDetailSchema = new Schema({
dob : Number,
gender : String,
followers : [UserSchema],
following : [UserSchema],
posts : [PostSchema],
groups : [GroupSchema]
// ... and so on
});
Powiedzmy:
przypadku zalogowanego użytkownika, tylko
id
,name
,email
,phone
ilocation
mają być zwrócone.Pierwszy model użyje zapytania rzutowania, aby zwrócić właściwości w (1).
W drugim przypadku do wysłania zapytania do całego dokumentu użyto tylko nazwy
UserMinimalSchema
.Zasadniczo oba zapytania zwracają dokładnie tę samą ilość danych, o której mowa w (1).
Załóżmy, że średni obiekt użytkownika ma ograniczenie ~ 16MB i istnieje 1 milion rekordów.
Jeśli ktoś wykonał taki test/linki do dokumentacji, byłoby bardzo pomocne, aby zobaczyć, ile będzie miało znaczenie, aby podzielić, czy nie.
Podejrzewam (3), że tak też jest. Nie rozumiem (1), właściwości w 'UserMinimalSchema' nie są obecne w' UserDetailSchema'? Jeśli możesz podać linki, które udowodnią (3), będzie to bardzo pomocne, ponieważ spodziewam się, że tak się stanie, ale nie mogę go nigdzie znaleźć. –
@AmreshVenugopal masz rację. Pomyślałem, że chcesz zachować pewne szczegóły w obu schematach, ale po bliższej inspekcji dzielisz je w sposób unikalny. Jednakże powoduje to kolejne oszustwo, ponieważ jeśli chcesz uzyskać wszystkie informacje o użytkowniku, musisz wykonać dodatkowy krok, aby zapełnić użytkownika. Aktualizowanie odpowiedzi za pomocą większej liczby myśli. –