MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Карта Намаляване на вид заявка с необходимост от корелация с предишния ред

Ако правите това в релационна база данни, няма да сравнявате посещенията ред по ред, вместо това ще използвате заявка за агрегиране, за да намерите повторни посещения (с помощта на SELECT ... GROUP BY), така че трябва да го направите по същия начин в MongoDB.

Първо трябва да обобщите посещенията на клиент на магазин на ден:

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

РЕДАКТИРАНЕ тъй като искате да повторите само ДНИ, следващите ще групирате по клиент, по магазин и ще преброите колко различни ДНИ е имало за посещения от този клиент в този магазин:

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. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как да добавите автоматично увеличаващо се поле в агрегата на MongoDB?

  2. Вградени или препратени релации

  3. Страниране от страна на сървъра с поле за масив от низове на един документ

  4. MongoDB:Агрегиране с помощта на $cond с $regex

  5. Как да правя не-CRUD и неосновни MongoDB команди в ObjCMongoDB?