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

マップ前の行と相関させる必要があるクエリの種類を減らします

    リレーショナルデータベースでこれを行う場合は、訪問を行ごとに比較するのではなく、集計クエリを使用して(SELECT ... GROUP BYを使用して)繰り返し訪問を検索するため、MongoDBでも同じ方法で行う必要があります。

    まず、顧客ごと、店舗ごと、1日あたりの訪問数を集計する必要があります。

    group1 = { "$group" : {
            "_id" : {
                "c" : "$clientId",
                "l" : "$location",
                "day" : {
                    "y" : {
                        "$year" : "$tov"
                    },
                    "m" : {
                        "$month" : "$tov"
                    },
                    "d" : {
                        "$dayOfMonth" : "$tov"
                    }
                }
            },
            "visits" : {
                "$sum" : 1
            }
        }
    };
    

    編集 次にDAYSだけを繰り返したいので、顧客ごと、店舗ごとにグループ化し、その顧客がその店舗を訪れた日数を数えます。

    group2 = {"$group" : 
        {"_id" : {
            "c" : "$_id.c",
            "s" : "$_id.l"
        },
        "totalDays" : {
            "$sum" : 1
        }
    } };
    

    次に、同じ顧客が複数の日に同じ店舗に複数回訪問した上記のレコードのみを含めます。

    match = { "$match" : { "totalDays" : { "$gt" : 1 } } };
    

    サンプルデータセットと、上記のパイプライン操作を使用したこの集計の結果は次のとおりです。

    > db.visits.find({},{_id:0,purchases:0}).sort({location:1, clientId:1, tov:1})
    { "clientId" : 1, "location" : "l1", "tov" : ISODate("2013-01-01T20:00:00Z") }
    { "clientId" : 1, "location" : "l1", "tov" : ISODate("2013-01-01T21:00:00Z") }
    { "clientId" : 1, "location" : "l1", "tov" : ISODate("2013-01-03T20:00:00Z") }
    { "clientId" : 2, "location" : "l1", "tov" : ISODate("2013-01-01T21:00:00Z") }
    { "clientId" : 3, "location" : "l1", "tov" : ISODate("2013-01-01T21:00:00Z") }
    { "clientId" : 3, "location" : "l1", "tov" : ISODate("2013-01-02T21:00:00Z") }
    { "clientId" : 1, "location" : "l2", "tov" : ISODate("2013-01-01T23:00:00Z") }
    { "clientId" : 3, "location" : "l2", "tov" : ISODate("2013-01-02T21:00:00Z") }
    { "clientId" : 3, "location" : "l2", "tov" : ISODate("2013-01-02T21:00:00Z") }
    { "clientId" : 1, "location" : "l3", "tov" : ISODate("2013-01-03T20:00:00Z") }
    { "clientId" : 2, "location" : "l3", "tov" : ISODate("2013-01-04T20:00:00Z") }
    { "clientId" : 4, "location" : "l3", "tov" : ISODate("2013-01-04T20:00:00Z") }
    { "clientId" : 4, "location" : "l3", "tov" : ISODate("2013-01-04T21:00:00Z") }
    { "clientId" : 4, "location" : "l3", "tov" : ISODate("2013-01-04T22:00:00Z") }
    
    > db.visits.aggregate(group1, group2, match)
    {
        "result" : [
        {
            "_id" : {
                "c" : 3,
                "s" : "l1"
            },
            "totalDays" : 2
        },
        {
            "_id" : {
                "c" : 1,
                "s" : "l1"
            },
            "totalDays" : 2
        }
        ],
        "ok" : 1
    }
    



    1. mongodbでジャーナルのサイズを制御する方法は?

    2. MongoDB $ switch

    3. AWSEC2インスタンスにインストールされているMongoDBの保存場所をEBSストレージに設定します。そして、インスタンスが停止/終了した後にそれを回復するにはどうすればよいですか?

    4. 特定の値を含む配列を持つドキュメントを検索する