Als u dit in een relationele database zou doen, zou u de bezoeken niet rij voor rij vergelijken, maar zou u een aggregatiequery gebruiken om herhaalde bezoeken te vinden (met SELECT ... GROUP BY), dus u zou het op dezelfde manier moeten doen in MongoDB.
Eerst moet u bezoeken per klant per winkel per dag samenvoegen:
group1 = { "$group" : {
"_id" : {
"c" : "$clientId",
"l" : "$location",
"day" : {
"y" : {
"$year" : "$tov"
},
"m" : {
"$month" : "$tov"
},
"d" : {
"$dayOfMonth" : "$tov"
}
}
},
"visits" : {
"$sum" : 1
}
}
};
BEWERKEN aangezien u alleen DAGEN wilt herhalen, zou u vervolgens groeperen per klant, per winkel en tellen hoeveel verschillende DAGEN er waren voor bezoeken van die klant aan die winkel:
group2 = {"$group" :
{"_id" : {
"c" : "$_id.c",
"s" : "$_id.l"
},
"totalDays" : {
"$sum" : 1
}
} };
Dan wilt u alleen de records van boven opnemen waar meerdere dagen door dezelfde klant aan dezelfde winkel zijn geweest:
match = { "$match" : { "totalDays" : { "$gt" : 1 } } };
Hier is een voorbeeldgegevensset en het resultaat van deze aggregaties met behulp van de bovenstaande pijplijnbewerkingen:
> 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
}