सबसे अच्छा विकल्प $redact
. का उपयोग करना है एकत्रीकरण पाइपलाइन चरण:
db.collection.aggregate([
{ "$redact": {
"$cond": {
"if": {
"$gt": [
{ "$subtract": [ "$lastUpdate", "$createdDate" ] },
1000 * 60 * 60 * 24
]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}}
])
तो आप मिलीसेकंड मान को एक दिन के लिए मिलीसेकंड मान से अधिक अंतर से देख रहे हैं। $subtract
अंतर के लिए गणित करता है, और जब दो तिथियों को घटाया जाता है तो मिलीसेकंड में अंतर वापस आ जाता है।
$redact
ऑपरेटर तार्किक अभिव्यक्ति को "if" के रूप में लेता है, और जहां वह स्थिति true
. है यह "फिर" में कार्रवाई करता है जो कि $$KEEP
. है दस्तावेज़। जहां यह false
है फिर दस्तावेज़ को $$PRUNE
. के साथ परिणामों से हटा दिया जाता है ।
ध्यान दें कि चूंकि यह एक तार्किक स्थिति है और सेट मान या मानों की श्रेणी नहीं है, इसलिए "इंडेक्स" का उपयोग नहीं किया जाता है।
चूंकि एकत्रीकरण पाइपलाइन में संचालन मूल रूप से कोडित हैं, यह इस तरह के एक बयान का सबसे तेज़ निष्पादन है जिसे आप प्राप्त कर सकते हैं।
$where
. के साथ जावास्क्रिप्ट मूल्यांकन वैकल्पिक है . यह एक जावास्क्रिप्ट फ़ंक्शन अभिव्यक्ति लेता है जिसे इसी तरह एक true
return वापस करने की आवश्यकता होती है या false
मूल्य। शेल में आप इस तरह शॉर्टहैंड कर सकते हैं:
db.collection.find(function() {
return ( this.lastUpdate.valueOf() - this.createdDate.valueOf() )
> ( 1000 * 60 * 60 * 24 );
})
वही बात, सिवाय इसके कि जावास्क्रिप्ट मूल्यांकन के लिए व्याख्या की आवश्यकता होती है और यह .aggregate()
की तुलना में बहुत धीमी गति से चलेगा। समकक्ष। उसी टोकन से, इस प्रकार की अभिव्यक्ति प्रदर्शन को अनुकूलित करने के लिए किसी अनुक्रमणिका का उपयोग नहीं कर सकती है।
सर्वश्रेष्ठ . के लिए परिणाम, दस्तावेज़ में अंतर संग्रहीत करें। तब आप सीधे उस संपत्ति पर सीधे पूछताछ कर सकते हैं, और निश्चित रूप से आप इसे अनुक्रमित भी कर सकते हैं।