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:
$unwind
alleSessions
elementen$match
documenten binnen het datumbereik$group
documenten samen door_id
,First_Name
,Last_Name
$project
documenten 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")
}
}
}
})