Nếu bạn đang làm điều này trong cơ sở dữ liệu quan hệ, bạn sẽ không so sánh các lượt truy cập theo từng hàng, thay vào đó bạn sẽ sử dụng truy vấn tổng hợp để tìm các lượt truy cập lặp lại (sử dụng SELECT ... GROUP BY), vì vậy bạn nên thực hiện theo cách tương tự trong MongoDB.
Trước tiên, bạn cần tổng hợp số lượt truy cập cho mỗi khách hàng mỗi cửa hàng mỗi ngày:
group1 = { "$group" : {
"_id" : {
"c" : "$clientId",
"l" : "$location",
"day" : {
"y" : {
"$year" : "$tov"
},
"m" : {
"$month" : "$tov"
},
"d" : {
"$dayOfMonth" : "$tov"
}
}
},
"visits" : {
"$sum" : 1
}
}
};
CHỈNH SỬA vì bạn chỉ muốn lặp lại NGÀY tiếp theo, bạn sẽ phân nhóm theo khách hàng, theo cửa hàng và đếm xem có bao nhiêu NGÀY khác nhau để khách hàng đó ghé thăm cửa hàng đó:
group2 = {"$group" :
{"_id" : {
"c" : "$_id.c",
"s" : "$_id.l"
},
"totalDays" : {
"$sum" : 1
}
} };
Sau đó, bạn chỉ muốn bao gồm các bản ghi ở trên nơi có nhiều hơn một lượt khách hàng ghé thăm cùng một cửa hàng trong nhiều ngày:
match = { "$match" : { "totalDays" : { "$gt" : 1 } } };
Dưới đây là tập dữ liệu mẫu và kết quả của việc tổng hợp này bằng cách sử dụng các hoạt động đường ống ở trên:
> 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
}