Ще ви трябва $elemMatch и обобщаване .
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"
}
}
])
Така че заявката ще изпълни тези стъпки:
$unwind
всичкиSessions
елементи$match
документи в рамките на периода от време$group
заедно документи по_id
,First_Name
,Last_Name
$project
документите да изглеждат като оригиналния формат
Пропуснах някои полета, но можете лесно да ги добавите в $group
и $project
стъпки. И разбира се, ще трябва да промените периода от време.
Загрижен съм за ефективността на тази заявка в голяма колекция. Може би е по-добре, ако използвате първата заявка, която дадох, и филтрирате сесиите, които искате в кода си.
Редактиране:
Както каза @chridam, тази заявка ще работи само ако промените Last_Login
към ISODate()
, какво се препоръчва.
Редактиране 2:
Актуализиране на заявката за използване на aggregate
и съответства на заявката само за извличане на Sessions
вътре в диапазона от дати.
Това е старата версия:
db.users.filter({
'Sessions': {
'$elemMatch': {
'Last_Login': {
'$gte': ISODate("2016-06-16T00:00:00.0Z"),
'$lt': ISODate("2016-06-17T00:00:00.0Z")
}
}
}
})