Anda memerlukan $elemMatch dan agregat .
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"
}
}
])
Jadi kueri akan melakukan langkah-langkah itu:
$unwind
semuaSessions
elemen$match
dokumen dalam rentang tanggal$group
bersama-sama dokumen dengan_id
,First_Name
,Last_Name
$project
dokumen agar terlihat seperti format aslinya
Saya menghilangkan beberapa bidang, tetapi Anda dapat dengan mudah menambahkannya di $group
dan $project
Langkah. Dan tentu saja Anda harus mengubah rentang tanggal.
Saya khawatir tentang kinerja kueri ini dalam koleksi besar. Mungkin lebih baik jika Anda menggunakan kueri pertama yang saya berikan dan memfilter sesi yang Anda inginkan dalam kode Anda.
Sunting:
Seperti yang dikatakan @chridam, kueri ini hanya akan berfungsi jika Anda mengubah Last_Login
ke ISODate()
, apa yang direkomendasikan.
Sunting 2
Memperbarui kueri untuk menggunakan aggregate
dan cocokkan dengan permintaan hanya ambil Sessions
dalam rentang tanggal.
Ini adalah versi lama:
db.users.filter({
'Sessions': {
'$elemMatch': {
'Last_Login': {
'$gte': ISODate("2016-06-16T00:00:00.0Z"),
'$lt': ISODate("2016-06-17T00:00:00.0Z")
}
}
}
})