2012-03-28 13 views
11

Chcę sprawdzić, czy tworzone przeze mnie zapytanie mongoose używa moich indeksów. Czy istnieje sposób, że mogę wyświetlić ostateczne zapytanie, które jest generowane do mongodb, tak aby można uruchomić .explain() na kwerendę?Jak wyświetlić plan wykonania zapytania mongoose.js

Mogę odgadnąć, co generuje zapytanie, ale chciał tylko zweryfikować.

np.

var query = Post.find() 
    .regex('lowerCaseTitle', searchRegEx) 
    .$gte('status',0) 
    .$lt('start', now) 
    .$gt('end',now) 
    .sort('total', -1) 
    .limit(50); 

Odpowiedz

-2

Jednym ze sposobów jest użycie profilera MongoDB i ustawić ją na rejestrowanie wszystkich operacji:

http://www.mongodb.org/display/DOCS/Database+Profiler

Nie jestem pewien, czy istnieje prostszy sposób to zrobić za pomocą samego mangusta, ale to byłoby miłe.

Aktualizacja: Dodając do tego, co Dan powiedział w komentarzu do drugiej odpowiedzi, należy włączyć profiler, aby uzyskać to, co chcesz, i wyłączyć go. Pozostawienie go jako "zaloguj wszystkie operacje" jest zdecydowanie dobrym sposobem na spowolnienie systemu. Ograniczenie go do środowiska programistycznego jest również dobrym pomysłem.

-3

Najprostszym rozwiązaniem może być jedynie replikowanie tego zapytania w powłoce MongoDB. Coś takiego:

> var now = new Date(); 
> db.post.find({lowerCaseTitle: /your_regex_here/, status: {$gte: 0}, start: {$lt: now}, end: {$gt: now}}).sort({total: -1}).limit(50) 

Powinno to zwrócić takie same wyniki, jak w zapytaniu w pliku mongoose.js. Następnie można dodać .explain() aby zobaczyć plan wykonania używane przez MongoDB:

> db.post.find({lowerCaseTitle: /your_regex_here/, status: {$gte: 0}, start: {$lt: now}, end: {$gt: now}}).sort({total: -1}).limit(50).explain() 
+2

I Mogę zgadywać na pytanie, które on tworzy, ale chciałem to sprawdzić, aby upewnić się, że rzeczywiście było to, co zostało wysłane do mongo z mangusty. – MonkeyBonkey

+0

Ach, przepraszam, źle zrozumiałem. W takim przypadku możesz zweryfikować za pomocą profilera, jak sugeruje Wes Freeman, ale zrobiłbym to tylko podczas programowania, a nie w produkcji. Profiler niesie pewne koszty, więc nie jest zalecany do użytku produkcyjnego. – dcrosta

39

można uzyskać zapytanie wykonania za pomocą opcji debugowania na mangusta:

mongoose.set('debug', true); 

lub

mongoose.set('debug', function (collectionName, method, query, doc, options) { 
    // 
}); 
+0

Zdecydowanie prawidłową odpowiedź, wybierz to – electblake

Powiązane problemy