2012-03-28 42 views
11

Tôi muốn xác minh rằng truy vấn mongoose mà tôi đang tạo đang sử dụng các chỉ mục của mình. Có cách nào mà tôi có thể xem các truy vấn cuối cùng được tạo ra để mongodb để tôi có thể chạy một .explain() trên truy vấn?làm cách nào tôi có thể xem kế hoạch thực hiện truy vấn mongoose.js

Tôi có thể đoán truy vấn mà nó tạo ra là gì, nhưng chỉ muốn xác minh.

ví dụ:

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

Trả lời

-2

Một cách là sử dụng các hồ sơ MongoDB và thiết lập nó để đăng nhập tất cả các hoạt động:

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

Tôi không chắc chắn nếu có một cách đơn giản hơn để làm điều đó thông qua bản thân cầy mangut, nhưng thật là tốt.

Cập nhật: Thêm vào những gì Dan đã nói trong nhận xét của câu trả lời khác, bạn nên bật trình thu thập thông tin để có được những gì bạn muốn và tắt nó đi. Để nó như là "đăng nhập tất cả các hoạt động" chắc chắn là một cách tốt để làm chậm hệ thống của bạn. Việc giới hạn nó vào một môi trường phát triển cũng là một ý tưởng hay.

-3

Cách tiếp cận dễ nhất có thể là chỉ sao chép truy vấn đó trong trình bao MongoDB. Một cái gì đó như:

> 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) 

Điều này sẽ trả lại kết quả tương tự như bạn nhận được từ truy vấn trong mongoose.js. Sau đó bạn có thể thêm một .explain() để xem kế hoạch thực hiện sử dụng bởi MongoDB:

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

tôi có thể đoán tại truy vấn mà nó tạo ra, nhưng tôi muốn xác minh để chắc chắn rằng đó thực sự là những gì đã được gửi đến mongo từ mongoose. – MonkeyBonkey

+0

Ah, tôi xin lỗi, tôi hiểu lầm. Trong trường hợp đó, bạn có thể xác minh bằng cách sử dụng profiler như Wes Freeman gợi ý, nhưng tôi sẽ làm như vậy chỉ trong quá trình phát triển chứ không phải trong sản xuất. Profiler mang một số chi phí, vì vậy nó không được khuyến khích cho sử dụng sản xuất. – dcrosta

39

Bạn có thể nhận các truy vấn thực hiện bằng cách sử dụng tùy chọn gỡ lỗi trên mongoose:

mongoose.set('debug', true); 

hoặc

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

cho đến nay câu trả lời đúng, hãy chọn điều này – electblake

Các vấn đề liên quan