आपको आवश्यकता होगी $elemMatch और एग्रीगेट ।
db.users.aggregate([
{
$unwind: "$Sessions"
},
{
$match: {
"Sessions.Last_Login": {
$gte: ISODate("2016-06-16T00:00:00.0Z"),
$lt: ISODate("2016-06-17T00:00:00.0Z")
}
}
},
{
$group: {
_id: {
_id: "$_id",
First_Name: "$First_Name",
Last_Name: "$Last_Name"
},
Sessions: {
$push: "$Sessions"
}
}
},
{
$project: {
_id: "$_id._id",
First_Name: "$_id.First_Name",
Last_Name: "$_id.Last_Name",
Sessions: "$Sessions"
}
}
])
तो क्वेरी उन चरणों को पूरा करेगी:
$unwind
सभीSessions
तत्व$match
दिनांक सीमा के अंदर दस्तावेज़$group
_id
. द्वारा एक साथ दस्तावेज़ ,First_Name
,Last_Name
$project
मूल प्रारूप की तरह दिखने वाले दस्तावेज़
मैंने कुछ फ़ील्ड छोड़े हैं, लेकिन आप इसे आसानी से $group
. में जोड़ सकते हैं और $project
कदम। और निश्चित रूप से आपको तिथि सीमा बदलनी होगी।
मैं एक बड़े संग्रह में इस क्वेरी के प्रदर्शन के बारे में चिंतित हूं। हो सकता है कि आप मेरे द्वारा दी गई पहली क्वेरी का उपयोग करें और अपने कोड में अपने इच्छित सत्रों को फ़िल्टर करें।
संपादित करें:
जैसा कि @chridam ने कहा, यह क्वेरी तभी काम करेगी जब आप Last_Login
. को बदलेंगे करने के लिए ISODate()
, क्या अनुशंसित है।
2 संपादित करें:
aggregate
. का उपयोग करने के लिए क्वेरी को अपडेट करना और केवल Sessions
लाने के अनुरोध का मिलान करें दिनांक सीमा के अंदर।
यह पुराना संस्करण है:
db.users.filter({
'Sessions': {
'$elemMatch': {
'Last_Login': {
'$gte': ISODate("2016-06-16T00:00:00.0Z"),
'$lt': ISODate("2016-06-17T00:00:00.0Z")
}
}
}
})