sql >> Database teknologi >  >> NoSQL >> MongoDB

Mongo Map Reducer første gang

Ok, jeg har fundet på noget, som jeg mener kan gøre hvad du vil. Bemærk, at dette muligvis ikke virker præcist, da jeg ikke er 100 % sikker på dit skema (i betragtning af at dine eksempler viser refer tilgængelig i type a, men ikke b (jeg er ikke sikker på, om det er en udeladelse, eller hvad du ønsker at se af referent)... Uanset hvad, her er, hvad jeg er kommet frem til:

Kortfunktionen:

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);
}

Funktionen Reducer:

function(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;
}

Så dybest set, hvordan det fungerer, er dette. Kortfunktionen bruger en tast refer.url (hvad jeg gættede ud fra din beskrivelse). Så slutresultatet vil ligne en matrix med _id lig med refer.url (Det grupperer baseret på url). Det opretter derefter et objekt, der har to objekter under sig (typer og tags). Grunden til objektet er, at kort og reducere kan udsende det samme formatobjekt. Bortset fra det, MENER jeg, at det burde være relativt selvforklarende (hvis du ikke forstår det, kan jeg prøve at forklare mere)...

Så lad os implementere dette i PHP (forudsat at $map og $reduce er strenge med ovenstående indeholdt med dem for korthed):

$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";
}

Bemærk, jeg har ikke testet dette. Dette er bare, hvad jeg er kommet frem til baseret på min forståelse af dit skema, og fra min forståelse af Mongo og dens Map-Reduce implementering...



  1. Port forwarding med nginx fra java

  2. Sorter indlejret række af objekter

  3. Redis pub sub max abonnenter og udgivere

  4. Matchbetingelser og seneste dato fra array