sql >> Databáze >  >> NoSQL >> MongoDB

Mapa Omezte druh dotazu s potřebou korelovat s předchozím řádkem

Pokud byste to dělali v relační databázi, neporovnávali byste návštěvy řádek po řádku, místo toho byste použili agregační dotaz k nalezení opakovaných návštěv (pomocí SELECT ... GROUP BY), takže byste to měli udělat stejným způsobem v MongoDB.

Nejprve musíte agregovat návštěvy na zákazníka na obchod a den:

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

UPRAVIT protože jako další chcete opakovat pouze DNY, seskupíte je podle zákazníka, podle obchodu a spočítáte, kolik různých DNÍ bylo pro návštěvy daného zákazníka v daném obchodě:

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

Pak chcete zahrnout pouze záznamy shora, kde došlo k více než jedné návštěvě stejného zákazníka ve stejném obchodě během několika dní:

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

Zde je ukázkový soubor dat a výsledek této agregace pomocí výše uvedených operací kanálu:

> 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. Jaké jsou výhody použití databáze bez schémat, jako je MongoDB, ve srovnání s relační databází?

  2. Docker-compose a mongoDB:Nepodařilo se spustit WiredTiger v jakékoli verzi kompatibility?

  3. RoR :Mongoid a formulář vytvářejí hash

  4. Použijte řetězcovou proměnnou ve výrazu LINQ lambda