Będziesz potrzebować $elemMatch i agregacja .
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"
}
}
])
Zapytanie wykona te kroki:
$unwind
wszystkieSessions
elementy$match
dokumenty w zakresie dat$group
razem dokumenty według_id
,First_Name
,Last_Name
$project
dokumenty, aby wyglądały jak oryginalny format
Pominąłem niektóre pola, ale możesz je łatwo dodać w $group
i $project
kroki. I oczywiście musisz zmienić zakres dat.
Niepokoi mnie wydajność tego zapytania w dużej kolekcji. Może lepiej, jeśli użyjesz pierwszego zapytania, które podałem i odfiltrujesz sesje, które chcesz w swoim kodzie.
Edytuj:
Jak powiedział @chridam, to zapytanie będzie działać tylko wtedy, gdy zmienisz Last_Login
do ISODate()
, co jest zalecane.
Edytuj 2:
Aktualizowanie zapytania tak, aby używało aggregate
i dopasuj żądanie pobierania tylko Sessions
w zakresie dat.
To jest stara wersja:
db.users.filter({
'Sessions': {
'$elemMatch': {
'Last_Login': {
'$gte': ISODate("2016-06-16T00:00:00.0Z"),
'$lt': ISODate("2016-06-17T00:00:00.0Z")
}
}
}
})