Je hebt $elemMatch nodig en aggregeren .
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"
}
}
])
Dus de query zal die stappen uitvoeren:
$unwindalleSessionselementen$matchdocumenten binnen het datumbereik$groupdocumenten samen door_id,First_Name,Last_Name$projectdocumenten eruitzien als het originele formaat
Ik heb enkele velden weggelaten, maar je kunt ze gemakkelijk toevoegen in $group en $project stappen. En natuurlijk moet je de periode wijzigen.
Ik maak me zorgen over de prestaties van deze query in een grote verzameling. Misschien is het beter als je de eerste vraag gebruikt die ik heb gegeven en de gewenste sessies in je code filtert.
Bewerken:
Zoals @chridam al zei, werkt deze query alleen als je Last_Login wijzigt naar ISODate() , wat wordt aanbevolen.
Bewerken 2:
De zoekopdracht bijwerken om aggregate te gebruiken en overeenkomen met het verzoek van alleen ophalen van Sessions binnen het datumbereik.
Dit is de oude versie:
db.users.filter({
'Sessions': {
'$elemMatch': {
'Last_Login': {
'$gte': ISODate("2016-06-16T00:00:00.0Z"),
'$lt': ISODate("2016-06-17T00:00:00.0Z")
}
}
}
})