Tùy chọn tốt nhất là sử dụng $redact
giai đoạn đường ống tổng hợp:
db.collection.aggregate([
{ "$redact": {
"$cond": {
"if": {
"$gt": [
{ "$subtract": [ "$lastUpdate", "$createdDate" ] },
1000 * 60 * 60 * 24
]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}}
])
Vì vậy, bạn đang xem xét giá trị mili giây từ sự khác biệt lớn hơn giá trị mili giây cho một ngày. $subtract
thực hiện phép toán cho sự khác biệt và khi hai ngày được trừ đi, sự khác biệt tính bằng mili giây sẽ được trả về.
$redact
toán tử nhận một biểu thức logic là "if" và điều kiện đó là true
trong đó nó thực hiện hành động trong "then" để $$KEEP
tài liệu. Nó ở đâu false
thì tài liệu bị xóa khỏi kết quả với $$PRUNE
.
Lưu ý rằng vì đây là điều kiện logic và không phải là giá trị đặt hoặc phạm vi giá trị, nên "chỉ mục" không được sử dụng.
Vì các hoạt động trong quy trình tổng hợp được mã hóa nguyên bản, nên đây là cách thực thi câu lệnh như vậy nhanh nhất mà bạn có thể nhận được.
Thay thế là đánh giá JavaScript với $where
. Điều này sử dụng một biểu thức hàm JavaScript cần trả về một true
tương tự hoặc false
giá trị. Trong shell, bạn có thể viết tắt như thế này:
db.collection.find(function() {
return ( this.lastUpdate.valueOf() - this.createdDate.valueOf() )
> ( 1000 * 60 * 60 * 24 );
})
Tương tự, ngoại trừ việc đánh giá JavaScript yêu cầu diễn giải và sẽ chạy chậm hơn nhiều so với .aggregate()
tương đương. Tương tự, loại biểu thức này không thể sử dụng chỉ mục để tối ưu hóa hiệu suất.
Để tốt nhất kết quả, lưu trữ sự khác biệt trong tài liệu. Sau đó, bạn có thể chỉ cần truy vấn trực tiếp trên thuộc tính đó và tất nhiên bạn cũng có thể lập chỉ mục nó.