MongoDB 3.6 और नए के लिए:
$expr
ऑपरेटर क्वेरी भाषा के भीतर एकत्रीकरण अभिव्यक्तियों के उपयोग की अनुमति देता है, इस प्रकार आप $dateToString
दिनांक फ़ील्ड बदलने के लिए ऑपरेटर:
db.test.find({
"$expr": {
"$ne": [
{ "$dateToString": { "format": "%Y-%m-%d", "date": "$created" } },
{ "$dateToString": { "format": "%Y-%m-%d", "date": "$last_active" } }
]
}
})
या $ के साथ एग्रीगेशन फ्रेमवर्क का उपयोग करना मैच
पाइपलाइन
db.test.aggregate([
{ "$match": {
"$expr": {
"$ne": [
{ "$dateToString": { "format": "%Y-%m-%d", "date": "$created" } },
{ "$dateToString": { "format": "%Y-%m-%d", "date": "$last_active" } }
]
}
} }
])
MongoDB 3.0+ के लिए:
आप एग्रीगेशन फ्रेमवर्क का उपयोग के साथ भी कर सकते हैं। $react
पाइपलाइन ऑपरेटर जो आपको तार्किक स्थिति को $cond
ऑपरेटर और विशेष संचालन का उपयोग करता है $$ रखें
दस्तावेज़ को "रखने" के लिए जहाँ तार्किक स्थिति सही है या $$PRUNE
उस दस्तावेज़ को "निकालने" के लिए जहां शर्त गलत थी।
निम्नलिखित समग्र संचालन को चलाने पर विचार करें जो उपरोक्त अवधारणा को प्रदर्शित करता है:
db.test.aggregate([
{
"$redact": {
"$cond": [
{
"$ne": [
{ "$dateToString": { "format": "%Y-%m-%d", "date": "$created" } },
{ "$dateToString": { "format": "%Y-%m-%d", "date": "$last_active" } }
]
},
"$$KEEP",
"$$PRUNE"
]
}
}
])
यह ऑपरेशन एक $प्रोजेक्ट
पाइपलाइन जो संग्रह में फ़ील्ड का चयन करती है और एक नया फ़ील्ड बनाती है जो तार्किक स्थिति क्वेरी से परिणाम रखती है और फिर बाद में $मिलान
, सिवाय इसके कि $redact
एकल पाइपलाइन चरण का उपयोग करता है जो अधिक कुशल है:
db.test.aggregate([
{
"$project": {
"created": 1,
"last_active": 1,
"sameDay": {
"$cond": [
{
"$eq": [
{"$substr" : ["$last_active",0, 10]},
{"$substr" : ["$created",0, 10]}
]
}, true, false
]
}
}
},
{ "$match": { "sameDay": false } }
])
0r
db.test.aggregate([
{
"$project": {
"created": 1,
"last_active": 1,
"sameDay": {
"$cond": [
{
"$eq": [
{ "$dateToString": { "format": "%Y-%m-%d", "date": "$created" } },
{ "$dateToString": { "format": "%Y-%m-%d", "date": "$last_active" } }
]
}, true, false
]
}
}
},
{ "$match": { "sameDay": false } }
])
दूसरा तरीका यह होगा कि $where<का इस्तेमाल किया जाए /कोड>
अपने ढूंढें()
. में ऑपरेटर विधि लेकिन ध्यान दें कि <का उपयोग करने के बाद से क्वेरी काफी धीमी होगी कोड>$कहां
अकेले एक टेबल स्कैन की आवश्यकता होती है और डेटाबेस संग्रह में प्रत्येक दस्तावेज़ के लिए जावास्क्रिप्ट अभिव्यक्ति या फ़ंक्शन निष्पादित करता है, इसलिए यदि आप कर सकते हैं तो अनुक्रमित प्रश्नों के साथ गठबंधन करें क्योंकि जब आप इसे मानक MongoDB ऑपरेटरों (जैसे, <) का उपयोग करके व्यक्त करते हैं तो क्वेरी प्रदर्शन में भी सुधार होता है। कोड>$gt , $in
):
db.test.find({
"$where": function() {
return this.created.getDate() !== this.last_active.getDate()
}
});
या अधिक कॉम्पैक्ट:
db.test.find({ "$where": "this.created.getDate() !== this.last_active.getDate()" });
इनपुट के साथ:
/* 0 */
{
"_id" : 1,
"created" : ISODate("2014-12-19T06:01:17.171Z"),
"last_active" : ISODate("2014-12-21T15:38:13.842Z")
}
/* 1 */
{
"_id" : 2,
"created" : ISODate("2015-07-06T12:17:32.084Z"),
"last_active" : ISODate("2015-07-06T18:07:08.145Z")
}
/* 2 */
{
"_id" : 3,
"created" : ISODate("2015-07-06T06:01:17.171Z"),
"last_active" : ISODate("2015-07-07T10:04:30.921Z")
}
/* 3 */
{
"_id" : 4,
"created" : ISODate("2015-07-06T06:01:17.171Z"),
"last_active" : ISODate("2015-07-06T09:47:44.186Z")
}
/* 4 */
{
"_id" : 5,
"created" : ISODate("2013-12-19T06:01:17.171Z"),
"last_active" : ISODate("2014-01-20T13:21:37.427Z")
}
एकत्रीकरण रिटर्न:
/* 0 */
{
"result" : [
{
"_id" : 1,
"created" : ISODate("2014-12-19T06:01:17.171Z"),
"last_active" : ISODate("2014-12-21T15:38:13.842Z"),
"sameDay" : false
},
{
"_id" : 3,
"created" : ISODate("2015-07-06T06:01:17.171Z"),
"last_active" : ISODate("2015-07-07T10:04:30.921Z"),
"sameDay" : false
},
{
"_id" : 5,
"created" : ISODate("2013-12-19T06:01:17.171Z"),
"last_active" : ISODate("2014-01-20T13:21:37.427Z"),
"sameDay" : false
}
],
"ok" : 1
}