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:
$unwind
todas lasSessions
elementos$match
documentos dentro del intervalo de fechas$group
juntar documentos por_id
,First_Name
,Last_Name
$project
documentos 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")
}
}
}
})