आपको आवश्यकता होगी $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")
}
}
}
})