Necesitará $elemMatch y agregar .
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"
}
}
])
Entonces la consulta seguirá esos pasos:
$unwindtodas lasSessionselementos$matchdocumentos dentro del intervalo de fechas$groupjuntar documentos por_id,First_Name,Last_Name$projectdocumentos para que se vean como el formato original
Omití algunos campos, pero puedes agregarlos fácilmente en $group y $project pasos. Y, por supuesto, deberá cambiar el intervalo de fechas.
Me preocupa el rendimiento de esta consulta en una gran colección. Tal vez sea mejor si usa la primera consulta que le di y filtra las sesiones que desea en su código.
Editar:
Como dijo @chridam, esta consulta solo funcionará si cambia Last_Login a ISODate() , lo que se recomienda.
Edición 2:
Actualización de la consulta para usar aggregate y coincida con la solicitud de solo obtener Sessions dentro del intervalo de fechas.
Esta es la versión anterior:
db.users.filter({
'Sessions': {
'$elemMatch': {
'Last_Login': {
'$gte': ISODate("2016-06-16T00:00:00.0Z"),
'$lt': ISODate("2016-06-17T00:00:00.0Z")
}
}
}
})