Tôi đang gặp một số khó khăn để hiểu tại sao việc sử dụng kết hợp $gte và $lte làm cho các truy vấn cực kỳ CHẬM
1. Tổng số tất cả các bản ghi trong bộ sưu tập của tôi.
lệnh. đếm
truy vấn. {}
kết quả. 767226
thời gian. 0. 00. 00. 058039
2. Đếm bằng cách sử dụng 2 chỉ mục [bộ sưu tập, ngày_xử lý] sử dụng lệnh $lt, $gt [cho đến khi biết, mọi thứ đều như mong đợi và OK]
lệnh. đếm
truy vấn. {'Ngày xử lý'. {'$lt'. ngày giờ. ngày giờ[2014, 12, 31, 0, 0], '$gt'. ngày giờ. datetime[2014, 1, 1, 0, 0]}, 'bộ sưu tập'. 'scl'}
kết quả. 20267
thời gian. 0. 00. 00. 906559
3. Đếm bằng cách sử dụng 2 chỉ mục [bộ sưu tập, ngày_xử lý] sử dụng lệnh $lt, $gte [cho đến khi biết, mọi thứ đều như mong đợi và OK]
lệnh. đếm
truy vấn. {'Ngày xử lý'. {'$lt'. ngày giờ. ngày giờ[2014, 12, 31, 0, 0], '$gte'. ngày giờ. datetime[2014, 1, 1, 0, 0]}, 'bộ sưu tập'. 'scl'}
kết quả. 20267
thời gian. 0. 00. 00. 304122
4. Đếm bằng cách sử dụng 2 chỉ mục [bộ sưu tập, ngày_xử lý] sử dụng lệnh $lte, $gt [cho đến khi biết, mọi thứ đều như mong đợi và OK]
lệnh. đếm
truy vấn. {'Ngày xử lý'. {'$gt'. ngày giờ. ngày giờ[2014, 1, 1, 0, 0], '$lte'. ngày giờ. datetime[2014, 12, 31, 0, 0]}, 'bộ sưu tập'. 'scl'}
kết quả. 20267
thời gian. 0. 00. 00. 071070
5. Đếm sử dụng 2 chỉ mục [bộ sưu tập, ngày_xử lý] sử dụng lệnh $lte, $gte [KHÔNG ĐƯỢC, Rất CHẬM]
lệnh. đếm
truy vấn. {'Ngày xử lý'. {'$gte'. ngày giờ. ngày giờ[2014, 1, 1, 0, 0], '$lte'. ngày giờ. datetime[2014, 12, 31, 0, 0]}, 'bộ sưu tập'. 'scl'}
kết quả. 20267
thời gian. 0. 00. 13. 859353
5. Giải thích về truy vấn ngắn gọn bằng cách sử dụng 2 chỉ mục [thu thập, ngày_xử lý] sử dụng $lte, $gte, thu thập tổng số ['executionStats']['nReturned'] [nhanh hơn một cách kỳ lạ so với truy vấn trước đó]
command: explain
truy vấn. {'Ngày xử lý'. {'$gte'. ngày giờ. ngày giờ[2014, 1, 1, 0, 0], '$lte'. ngày giờ. datetime[2014, 12, 31, 0, 0]}, 'bộ sưu tập'. 'scl'}
kết quả. 20267
thời gian. 0. 00. 01. 469607
Điều tương tự sẽ không xảy ra nếu tôi chỉ sử dụng bộ lọc process_date
Câu hỏi.
1. Tại sao thời gian phản hồi của [$gt, $lt], [$gte, $lt] và [$gt, $lte] lại khác [nhanh hơn] so với $gte, $lte.
2. Làm cách nào tôi có thể cải thiện chỉ mục của mình để xấp xỉ tổng sốDocsExamined với nReturned, sử dụng 2 chỉ mục [bộ sưu tập, ngày xử lý]?
mongos> db. bài viết. tìm [{'bộ sưu tập'. 'scl', 'ngày xử lý'. {'$gte'. ISODate['2014-01-01'], '$lte'. ISODate['2014-12-31']}}]. giải thích['executionStats']['executionStats']
{
"nReturned". 20267,
"executionTimeMillis". 1669,
"totalKeysExamined". 68043,
"totalDocsExamined". 68043,
.
mongos> db. bài viết. getIndexes[]
[
{
"v". 1,
"chìa khóa". {
"_id". 1
},
"tên". "_id_",
"ns". "meta bài báo. bài viết"
}
.
.
{
"v". 1,
"chìa khóa". {
"bộ sưu tập". 1
},
"tên". "bộ sưu tập_1",
"ns". "meta bài viết. bài viết"
},
{
"v". 1,
"chìa khóa". {
"processing_date". 1
},
"tên". "processing_date_1",
"ns". "meta bài báo. bài viết"
}
]
Cảm ơn trước
MongoDB cung cấp nhiều toán tử truy vấn so sánh. Toán tử $gte [lớn hơn bằng] là một trong những toán tử đó. Toán tử $gte được sử dụng để chọn tài liệu có giá trị của trường lớn hơn hoặc bằng [i. e. >=] giá trị đã cho. Bạn có thể sử dụng toán tử này trong phương thức update, find, like theo yêu cầu của bạn
Cú pháp của toán tử $gte
ví dụ
Trong các ví dụ sau, chúng tôi đang làm việc với
>db.employee.find[] { "_id" : 1, "name" : "John", "father_name" : "Thomas", "department" : "Contain Writting", "experience" : 2, "mobile_no" : 9856321478, "gender" : "Male", "salary" : 22000, "age" : 26 } { "_id" : 2, "name" : "William", "father_name" : "Rebort", "department" : "Softwre Tester", "experience" : 1, "mobile_no" : 7896541478, "gender" : "Male", "salary" : 20000, "age" : 21 } { "_id" : 3, "name" : "Ava", "father_name" : "William", "department" : "Marketing manager", "experience" : 5, "mobile_no" : 8789654178, "gender" : "Female", "salary" : 36500, "age" : 25 } { "_id" : 4, "name" : "Olivia", "father_name" : "Noah", "department" : null, "experience" : 4, "mobile_no" : 9045641478, "gender" : "Female", "salary" : 30000, "age" : 27 } { "_id" : 5, "name" : "Elijah", "father_name" : "John", "department" : "HR", "experience" : 0, "mobile_no" : 6589741230, "gender" : "Male", "salary" : 15000, "age" : 20 } { "_id" : 6, "name" : "John", "father_name" : "Liam", "department" : "Softwre Tester", "experience" : 10, "mobile_no" : 9014536987, "gender" : "Male", "salary" : 55000, "age" : 30 }
ví dụ 1. Sử dụng toán tử $gte
Trong ví dụ này, chúng tôi đang tìm kiếm các tài liệu có thang lương bằng hoặc lớn hơn 20000
đầu ra
{ "_id" : 1, "name" : "John", "father_name" : "Thomas", "department" : "Contain Writting", "experience" : 2, "mobile_no" : 9856321478, "gender" : "Male", "salary" : 22000, "age" : 26 } { "_id" : 2, "name" : "William", "father_name" : "Rebort", "department" : "Softwre Tester", "experience" : 1, "mobile_no" : 7896541478, "gender" : "Male", "salary" : 20000, "age" : 21 } { "_id" : 3, "name" : "Ava", "father_name" : "William", "department" : "Marketing manager", "experience" : 5, "mobile_no" : 8789654178, "gender" : "Female", "salary" : 36500, "age" : 25 } { "_id" : 4, "name" : "Olivia", "father_name" : "Noah", "department" : null, "experience" : 4, "mobile_no" : 9045641478, "gender" : "Female", "salary" : 30000, "age" : 27 } { "_id" : 6, "name" : "John", "father_name" : "Liam", "department" : "Softwre Tester", "experience" : 10, "mobile_no" : 9014536987, "gender" : "Male", "salary" : 55000, "age" : 30 }
ví dụ 2. lĩnh vực khác
Trong ví dụ này, chúng tôi đang tìm kiếm các tài liệu có tuổi lớn hơn hoặc bằng 26
đầu ra
{ "_id" : 1, "name" : "John", "father_name" : "Thomas", "department" : "Contain Writting", "experience" : 2, "mobile_no" : 9856321478, "gender" : "Male", "salary" : 22000, "age" : 26 } { "_id" : 4, "name" : "Olivia", "father_name" : "Noah", "department" : null, "experience" : 4, "mobile_no" : 9045641478, "gender" : "Female", "salary" : 30000, "age" : 27 } { "_id" : 6, "name" : "John", "father_name" : "Liam", "department" : "Softwre Tester", "experience" : 10, "mobile_no" : 9014536987, "gender" : "Male", "salary" : 55000, "age" : 30 }
ví dụ 3. Cập nhật giá trị bằng toán tử $gte
Trong ví dụ này, chúng tôi đang cập nhật trường lương cho nhân viên có hơn hoặc bằng 3 năm kinh nghiệm làm việc