2012-09-28 6 views
5

Przeprowadzam migrację mojej aplikacji z wersji Mongoose 2.6.5 do wersji 3.1.2 i pojawia się nieoczekiwany zachowanie. Mianowicie zauważam, że wyniki zapytań są automatycznie ograniczane do 1000 rekordów, podczas gdy prawie wszystko inne działa tak samo. W moim kodzie (poniżej) ustawiłem wartość maxIvDataPoints, która ogranicza liczbę zwróconych punktów danych (i ostatecznie wysłanych do przeglądarki klienta), a wartość ta została ustawiona gdzie indziej na 1500. Używam kwerendy liczenia do określenia całkowitej liczby potencjalnych wyniki, a następnie kolejny mod w celu ograniczenia rzeczywistych wyników zapytania przy użyciu liczby i wartości maxIvDataPoints w celu określenia wartości mod. Używam węzła 0.8.4 i mongo 2.0.4, pisząc kod po stronie serwera w coffeescript.Mongoose ograniczające zapytanie do 1000 wyników, gdy chcę więcej/wszystko (migracja z wersji 2.6.5 do wersji 3.1.2)

Przed instalacją mangusty 3.1.x kod działał tak, jak chciałem, za każdym razem zwracając nieco poniżej 1500 punktów danych. Po zainstalowaniu 3.1.2 otrzymuję dokładnie 1000 punktów danych za każdym razem (zakładając, że istnieje ponad 1000 punktów danych w określonym zakresie). Wyniki są obcięte, więc punkty danych od 1001 do ~ 1500 nie są już zwracane.

Wygląda na to, że istnieje jakieś ustawienie, które reguluje to zachowanie, ale nie mogę znaleźć niczego w dokumentach, tutaj ani w grupie Google. Nadal jestem względnie n00b, więc mogłem przegapić coś oczywistego.

DataManager::ivDataQueryStream = (testId, minTime, maxTime, callback) -> 

    # If minTime and maxTime have been provided, set a flag to limit time extents of query 
    unless isNaN(minTime) 
    timeLimits = true 

    # Load the max number of IV data points to be displayed from CONFIG 
    maxIvDataPoints = CONFIG.maxIvDataPoints 

    # Construct a count query to determine the number if IV data points in range 
    ivCountQuery = TestDataPoint.count({}) 
    ivCountQuery.where "testId", testId 

    if timeLimits 
     ivCountQuery.gt "testTime", minTime 
     ivCountQuery.lt "testTime", maxTime 

    ivCountQuery.exec (err, count) -> 

     ivDisplayQuery = TestDataPoint.find({}) 
     ivDisplayQuery.where "testId", testId 

     if timeLimits 
      ivDisplayQuery.gt "testTime", minTime 
      ivDisplayQuery.lt "testTime", maxTime 

     # If the data set is too large, use modulo to sample, keeping the total data series 
     # for display below maxIvDataPoints 
     if count > maxIvDataPoints 
      dataMod = Math.ceil count/maxIvDataPoints 

      ivDisplayQuery.mod "dataPoint", dataMod, 1 

     ivDisplayQuery.sort "dataPoint" #, 1 <-- new sort syntax for Mongoose 3.x 
     callback ivDisplayQuery.stream() 

Odpowiedz

9

dostajesz potknął się przez parę powiązanych czynników:

  1. domyślne zapytanie Mongoose za batchSize changed to 1000 in 3.1.2.
  2. MongoDB ma known issue, gdzie zapytanie wymagające sortowania w pamięci wprowadza sztywny limit rozmiaru wsadu zapytania na liczbę zwróconych dokumentów.

więc opcje są umieścić wskaźnik combo na TestDataPoint który pozwoliłby Mongo ją wykorzystać do sortowania przez dataPoint w tego typu zapytania lub zwiększyć batch size przynajmniej ogólnej liczby dokumentów nie zwariować.

+0

Dzięki! To bardzo pomocne. W rzeczywistości mam to na mojej liście problemów, aby zaimplementować indeksy w TestDataPoint. Zamierzałem stworzyć taki, który jest '{testId: 1, dataPoint: 1}' i inny '{testId: 1, testTime: 1, dataPoint: 1}', głównie w celu przyspieszenia zapytań w powyższej funkcji. Ale w oparciu o to, co powiedziałeś, brzmi to tak, jakby umożliwił ci to, o czym wspomniałeś. Czy to jest poprawne? Również wydaje się dość trywialne, aby ustawić rozmiar wsadu na moją wartość "maxIvDataPoints". Czy ma to jakiś minus? – Eli

+0

@BRValentine Tak, powinny, ale użyj ['explain'] (www.mongodb.org/display/DOCS/Explain), aby potwierdzić, że zapytanie używa indeksu, którego się spodziewasz. I tak, ustawienie wielkości partii jest łatwe, a jedyną wadą jest krótki wzrost zapotrzebowania na pamięć. – JohnnyHK

4

Wow, to okropne. Opublikuję poprawkę do mongoose, która wkrótce usunie wartość domyślną batchSize (pomocne przy przesyłaniu dużych zestawów wyników). Dzięki za wskaźnik.

UPDATE: 3.2.1 i 2.9.1 zostały wydane z poprawką (usunięto domyślną wartość batchSize).

Powiązane problemy