Jika Anda melakukan ini dalam basis data relasional, Anda tidak akan membandingkan kunjungan baris demi baris, sebaliknya Anda akan menggunakan kueri agregasi untuk menemukan kunjungan berulang (menggunakan SELECT ... GROUP BY) jadi Anda harus melakukannya dengan cara yang sama di MongoDB.
Pertama, Anda perlu mengumpulkan kunjungan per pelanggan per toko per hari:
group1 = { "$group" : {
"_id" : {
"c" : "$clientId",
"l" : "$location",
"day" : {
"y" : {
"$year" : "$tov"
},
"m" : {
"$month" : "$tov"
},
"d" : {
"$dayOfMonth" : "$tov"
}
}
},
"visits" : {
"$sum" : 1
}
}
};
EDIT karena Anda hanya ingin mengulang DAYS berikutnya, Anda akan mengelompokkan menurut pelanggan, menurut toko, dan menghitung berapa banyak DAYS yang berbeda untuk kunjungan pelanggan tersebut ke toko itu:
group2 = {"$group" :
{"_id" : {
"c" : "$_id.c",
"s" : "$_id.l"
},
"totalDays" : {
"$sum" : 1
}
} };
Kemudian Anda hanya ingin menyertakan catatan dari atas di mana terdapat lebih dari satu kunjungan oleh pelanggan yang sama ke toko yang sama selama beberapa hari:
match = { "$match" : { "totalDays" : { "$gt" : 1 } } };
Berikut adalah contoh kumpulan data dan hasil dari agregasi ini menggunakan operasi pipeline di atas:
> 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
}