MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

Peta Mongo Mengurangi pertama kali

Oke, saya telah menemukan sesuatu yang pikirkan dapat melakukan apa yang Anda inginkan. Perhatikan, bahwa ini mungkin tidak berfungsi dengan tepat karena saya tidak 100% yakin dengan skema Anda (mengingat contoh Anda menunjukkan refer tersedia dalam tipe a, tetapi tidak b (saya tidak yakin apakah itu penghilangan, atau pertimbangan apa yang ingin Anda lihat oleh perujuk)... Bagaimanapun, inilah yang saya temukan:

Fungsi peta:

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

Fungsi Perkecil:

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

Jadi pada dasarnya, cara kerjanya adalah ini. Fungsi Peta menggunakan kunci refer.url (apa yang saya duga berdasarkan deskripsi Anda). Jadi hasil akhirnya akan terlihat seperti array dengan _id sama dengan refer.url (Ini mengelompokkan berdasarkan url). Itu kemudian membuat objek yang memiliki dua objek di bawahnya (tipe dan tag). Alasan objek tersebut adalah agar map dan reduce dapat memancarkan objek dengan format yang sama. Selain itu, saya PIKIR bahwa itu harus relatif cukup jelas (Jika Anda tidak mengerti, saya dapat mencoba menjelaskan lebih lanjut)...

Jadi mari kita implementasikan ini di PHP (Dengan asumsi bahwa $map dan $reduce adalah string dengan yang di atas terkandung dengan mereka untuk singkat):

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

Catatan, saya belum menguji ini. Inilah yang saya dapatkan berdasarkan pemahaman saya tentang skema Anda, dan dari pemahaman saya tentang Mongo dan implementasi Pengurangan Petanya...



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Kiat untuk Menyimpan Cadangan MongoDB di Cloud

  2. alternatif untuk menggunakan 'menunggu' dengan lazy_static! makro berkarat?

  3. Maks dan kelompokkan di Mongodb

  4. Bagaimana cara $mengatur item sub-sub-array di MongoDB

  5. tidak dapat mengambil data dari sudut http