sql >> データベース >  >> NoSQL >> MongoDB

ネストされた配列コレクションから取得するためのmongoDBクエリ

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

    したがって、クエリはこれらの手順を実行します:

    1. $unwind すべてのSessions 要素
    2. $match 日付範囲内のドキュメント
    3. $group _idでドキュメントをまとめる 、First_NameLast_Name
    4. $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")
                }
            }
        }
    })
    



    1. Node.js、WebSocket、Redisを使用してResqueの使用状況を視覚化する方法

    2. PythonのUnicode

    3. ApacheHBase書き込みパス

    4. 範囲クエリのために日付と時刻をMeteorに保存する方法は?