Được rồi, tôi đã nghĩ ra điều gì đó mà tôi nghĩ có thể làm những gì bạn muốn. Lưu ý rằng điều này có thể không hoạt động chính xác vì tôi không chắc chắn 100% về lược đồ của bạn (xem xét các ví dụ của bạn cho thấy refer
có sẵn trong loại a, nhưng không phải b (tôi không chắc đó có phải là một thiếu sót hay không, hay điều mà bạn muốn xem bởi người giới thiệu) ... Dù sao, đây là những gì tôi đã nghĩ ra:
Chức năng bản đồ:
function() {
var obj = {
"types": {},
"tags": {},
}
obj.types[this.type] = 1;
if (this.tags) {
for (var tag in this.tags) {
obj.tags[this.tags[tag]] = 1;
}
}
emit(this.refer.url, obj);
}
Chức năng Rút gọn:
Hàmfunction(key, values) {
var obj = {
"types": {},
"tags": {},
}
for (var i = 0; i < values.length; i++) {
for (var type in values[i].types) {
if (!type in obj.types) {
obj.types[type] = 0;
}
obj.types[type] += values[i].types[type];
}
for (var tag in values[i].tags) {
if (!tag in obj.tags) {
obj.tags[tag] = 0;
}
obj.tags[tag] += values[i].tags[tag];
}
}
return obj;
}
Vì vậy, về cơ bản, nó hoạt động như thế nào đây. Chức năng Bản đồ sử dụng một khóa là reference.url (những gì tôi đoán dựa trên mô tả của bạn). Vì vậy, kết quả cuối cùng sẽ giống như một mảng với _id
ngang bằng với reference.url (Nó nhóm dựa trên url). Sau đó, nó tạo ra một đối tượng có hai đối tượng dưới nó (loại và thẻ). Lý do cho đối tượng là bản đồ và thu nhỏ có thể phát ra cùng một đối tượng định dạng. Ngoài ra, tôi nghĩ rằng nó phải tương đối tự giải thích (Nếu bạn không hiểu, tôi có thể cố gắng giải thích thêm) ...
Vì vậy, hãy triển khai điều này trong PHP (Giả sử rằng $map
và $reduce
là các chuỗi với những thứ ở trên được chứa với chúng cho ngắn gọn):
$mapFunc = new MongoCode($map);
$reduceFunc = new MongoCode($reduce);
$query = array(
'time' => array('$gte' => time() - (60*60*60*24*30)),
'refer.external' => true
);
$collection = 'visits';
$command = array(
'mapreduce' => $collection,
'map' => $mapFunc,
'reduce' => $reduceFunc,
'query' => $query,
);
$statsInfo = $db->command($command);
$statsCollection = $db->selectCollection($sales['result']);
$stats = $statsCollection->find();
foreach ($stats as $stat) {
echo $stats['_id'] .' Visited ';
foreach ($stats['value']['types'] as $type => $times) {
echo "Type $type $times Times, ";
}
foreach ($stats['value']['tags'] as $tag => $times) {
echo "Tag $tag $times Times, ";
}
echo "\n";
}
Lưu ý, tôi chưa thử nghiệm điều này. Đây chỉ là những gì tôi nghĩ ra dựa trên sự hiểu biết của tôi về lược đồ của bạn và từ sự hiểu biết của tôi về Mongo và triển khai Map-Reduce của nó ...