MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Mapa Zmniejsz rodzaj zapytania z koniecznością skorelowania z poprzednim wierszem

Gdybyś robił to w relacyjnej bazie danych, nie porównywałbyś wizyt wiersz po wierszu, zamiast tego użyłbyś zapytania agregującego, aby znaleźć powtarzające się wizyty (za pomocą SELECT ... GROUP BY), więc powinieneś zrobić to w ten sam sposób w MongoDB.

Najpierw musisz zagregować wizyty na klienta na sklep dziennie:

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

EDYTUJ ponieważ chcesz powtarzać tylko DNI, pogrupuj je według klientów, według sklepów i policz, ile różnych DNI przypadało na wizyty tego klienta w tym sklepie:

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

Następnie chcesz uwzględnić tylko powyższe wpisy dotyczące więcej niż jednej wizyty tego samego klienta w tym samym sklepie w ciągu wielu dni:

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

Oto przykładowy zestaw danych i wynik tej agregacji przy użyciu powyższych operacji potoku:

> 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. findOneAndUpdate - Zaktualizuj pierwszy obiekt w tablicy, który ma określony atrybut

  2. Zapytanie Mongo w Pythonie, jeśli używam zmiennej jako wartości

  3. Mongoid - zapytania według przywołanego dokumentu

  4. Zrozumienie agregatu MongoDB i GroupBy

  5. mongoDB :zmiana nazwy kolumny w kolekcji