$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")
}
}
}
})