यदि आप इसे रिलेशनल डेटाबेस में कर रहे थे, तो आप पंक्ति दर पंक्ति की तुलना नहीं कर रहे होंगे, इसके बजाय आप बार-बार विज़िट खोजने के लिए एकत्रीकरण क्वेरी का उपयोग करेंगे (सेलेक्ट ... ग्रुप बाय का उपयोग करके) ताकि आपको इसे मोंगोडीबी में उसी तरह करना चाहिए।पी>
सबसे पहले आपको प्रति ग्राहक प्रति स्टोर प्रति दिन विज़िट एकत्रित करने की आवश्यकता है:
group1 = { "$group" : {
"_id" : {
"c" : "$clientId",
"l" : "$location",
"day" : {
"y" : {
"$year" : "$tov"
},
"m" : {
"$month" : "$tov"
},
"d" : {
"$dayOfMonth" : "$tov"
}
}
},
"visits" : {
"$sum" : 1
}
}
};
संपादित करें चूंकि आप केवल अगले DAYS को दोहराना चाहते हैं, इसलिए आप ग्राहक द्वारा, स्टोर द्वारा समूहित करेंगे और गिनेंगे कि उस ग्राहक द्वारा उस स्टोर पर आने के लिए कितने अलग-अलग DAYS थे:
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
}