2017-08-13 82 views
5

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:

  1. przypadku zalogowanego użytkownika, tylko id, name, email, phone i location mają być zwrócone.

  2. Pierwszy model użyje zapytania rzutowania, aby zwrócić właściwości w (1).

  3. W drugim przypadku do wysłania zapytania do całego dokumentu użyto tylko nazwy UserMinimalSchema.

  4. Zasadniczo oba zapytania zwracają dokładnie tę samą ilość danych, o której mowa w (1).

  5. 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.

Odpowiedz

1

Nie użyłbym modele dzielone: ​​

  1. Będziesz musiał wykonać spędzaj kwerendy populacja chcesz wyszukać wszystkie dane użytkownika
  2. Ty zwiększenie przechowywanie danych (teraz będzie musisz odwołać się do użytkownika w swoim schemacie szczegółów użytkownika
  3. Kiedy Mongo przejdzie do wyszukiwania, znajdzie odniesienia do instancji modelu i wyodrębni tylko te dane, które podałeś w swoim zapytaniu do projektu. obiekt do pamięci, chyba że określisz to w zapytaniu:
+0

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źć. –

+0

@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. –