różnica między znajdowaniem i znajdowaniem wywołań mongodb
<p>pracuję nad projektem i nie jestem pewien, czy istnieje różnica między sposobem działania kursora <code>find</code> a sposobem działania kursora <code>findone</code>. czy findone jest tylko opakowaniem dla <code>find().limit(1)</code>? rozglądałem się i może ktoś wie, czy mongodb ma do tego specjalną metodę, czy nie. pracuję z interfejsem php api dla mongodb, jeśli to robi różnicę).</p>
<p><strong>na podstawie moich własnych testów, <code>find().limit(1)</code> jest rzędami wielkości <em> szybciej </em> niż <code>findone()</code>.</strong></p><p>wystąpił błąd w dokumentacji mongodb lub błąd w <code>findone()</code>. <code>findone()</code> działa bardziej jak <code>find().limit(n)</code> gdzie n jest liczbą dokumentów, które zwróci zapytanie. zrozumiałem to, próbując dowiedzieć się, dlaczego moje proste zapytania były tak wolne!</p><p><strong>aktualizacja:</strong> odpowiedź inżyniera 10gen (mongodb):</p><blockquote> <p>dwa wykonywane zapytania są bardzo różne. zapytanie wyszukujące zwraca kursor, jest to zasadniczo scenariusz braku operacji, ponieważ żadne rzeczywiste dane nie są zwracane (tylko informacje o kursorze). jeśli wywołasz findone, w rzeczywistości zwracasz dane i zamykasz kursor. dokumenty powinny zdecydowanie być jaśniejsze :-)</p> </blockquote><p><strong>aktualizacja:</strong> rzeczywiście, jeśli dokument <code>find().limit(1)</code> zostanie pobrany, wydaje się, że rzędy różnicy prędkości prędkości znikają. ponadto nie mogłem odtworzyć głównej różnicy prędkości ze sterownikiem javascript mongodb. pierwotnie testowałem przy użyciu mongodb java.</p>
Obie alternatywy, które zostały wskazane ma wady i zalety, decyzja zależy od tego jak to plusy i minusy wpływa na aplikację:



> 
> Pobrać wszystkie wartości z bazy danych przy użyciu zwykłego PHP następnie przechowywać je w zmiennej JavaScript, później szukać sekund rozwijanej listy (jeśli wartość pierwszej rozwijanej liście na zmiany wartości) w zmiennej JavaScript (array).
> 
> 
> 


Plusy:


* Minimalizuje petycje http, trzeba tylko jedną prośbę, aby odzyskać całość danych.
* Minimalizuje kwerenda jest potrzebne w bazie danych, na ogół tylko wykonać jedno zapytanie.


Cons:


* Zwiększa ilość pamięci używanej jeśli masz duże ilości danych.
* Jeśli dane zmienia się nieustannie, użytkownicy nie widzą zmian aż odświeżyć całą stronę.



> 
> Jeśli pierwszy rozwijanej liście zmian wartości jest następnie pobrać wartości dla drugiej listy rozwijanej z bazą danych za pomocą technologii AJAX (jQuery).
> 
> 
> 


Plusy:


* Nie trzeba do przechowywania wszystkich danych w pamięci całych jedynie dane, które zostaną wykorzystane, co zmniejsza ilość potrzebnej pamięci.
* Twoje dane są aktualizowane za każdym razem, bez konieczności przeładowania strony tylko zmieniając wybór.


Cons:


* Trzeba wykonać kilka petycji HTTP i biegnie querys z bazą danych przy każdej zmianie wyboru.


Osobiście preferuję metodę 2, jeśli ilość danych jest stosunkowo duża i wydajność nie jest koniecznością. Jest to dość szerokie, ale dam ci tak ogólną odpowiedź, jak tylko mogę.

**CTE ...**

* Są niezindeksowalne (ale mogą używać istniejących indeksów na obiektach, do których istnieją odwołania)
* Nie można mieć ograniczeń
* Są zasadniczo jednorazowe `VIEW` s
* Trwać tylko do momentu uruchomienia następnego zapytania
* Może być rekurencyjny
* Nie masz dedykowanych statystyk (polegaj na statystykach dotyczących podstawowych obiektów)

**#Temp Tables ...**

* Są prawdziwe zmaterializowane tabele, które istnieją w tempdb
* Może być indeksowany
* Może mieć ograniczenia
* Trwaj w życiu obecnego POŁĄCZENIA
* Może odwoływać się do innych zapytań lub podprocedur
* Masz dedykowane statystyki generowane przez silnik

Jeśli chodzi o użycie każdego z nich, mają bardzo różne przypadki użycia.Jeśli masz bardzo duży zestaw wyników lub musisz odwołać się do niego więcej niż raz, umieść go w tabeli `#temp` .Jeśli ma być rekurencyjny, jednorazowy lub po prostu dla uproszczenia logicznego, preferowany jest `CTE` .

Ponadto należy `CTE`**nigdy nie używaj do wykonania**.Prawie nigdy nie przyspieszysz przy użyciu CTE, ponieważ znowu jest to widok jednorazowy.Możesz zrobić z nimi kilka fajnych rzeczy, ale przyspieszenie zapytania nie jest jednym z nich. Nie jestem użytkownikiem OS X, ale ze screenów znalezionych przez naszych Nicei znajomego Pan Google wydaje się, że ten wskazuje liczbę wątków utworzonych przez ten proces. Więc zarówno iTunes i Finder działają 7 wątki każdy. ja w kompie mam konta np. jest administrator i tak dalej.  
no i ja mam swoje konto i tam w operze nie działa.  
a na innym koncie w operze działa ;) kde, gnome i xfce to po prostu różne [środowiska graficzne](https://www.wikiwand.com/pl/graficzny_interfejs_u%c5%bcytkownika) i wybór każdego z nich to kwestia indywidualna, zależna od twoich potrzeb. możesz mieć zainstalowanych kilka środowisk, wtedy wybierasz przy logowaniu z którego chcesz korzystać, ale nie bez powodu domyślnie jest tylko jedno, bo im więcej zai… masz kilka możliwości: 

użyć pętli for i wewnątrz if

użyć pętli while

użyć po prostu filtra listy (\_\_ne\_\_ - not equal):

<https://www.online-python.com/uqefk1lvdj> 
pod względem wydajności najlepszy jest tutaj filtr. Może jestem szalony, ale obawy o prędkości w takich przypadkach przy użyciu języka interpretacyjny jest jak próbuje dowiedzieć się, jaki kolor pomalować szopy. Załóżmy nawet nie dostać się do idei, że ten rodzaj optymalizacji jest całkowicie przedwczesne.


Trafisz sedno, gdy powiedział: „konserwacji”. Chciałbym wybrać podejście, które jest najbardziej wydajne i najbardziej utrzymaniu. Jeśli trzeba przyspieszyć później, to nie przyjdzie od przełączania między proceduralne kontra obiektowego paradygmaty kodowania wewnątrz interpretowanym języku. pojawiają się jakieś komunikaty? wszystkie zależności zainstalowane? i którą wersję masz zainstalowaną? na python2 (calibre) czy na python3 (calibre-python3). i przede wszystkim czy masz zainstalowane calibre-common? python 2 czy 3 oba tego wymagają. no i oba przynajmniej jak przed chwilą u siebie s… poszukać na yt? :wink: przed poleceniem "ping [host|ip] > [plik]" wpisz polecenie "chcp 1250".  
  
dzieje się tak z powodu różnic w kodowaniu tekstu przez wiersz poleceń i notatnik:  
  
wiersz poleceń: 852.  
notatnik: 1250.