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

Bagaimana cara mengulangi dengan benar melalui file json besar

Anda akan ingin menggunakan pengurai streaming. Ini hanya menarik sebagian kecil file Anda ke dalam memori pada satu waktu.

Mereka datang dalam beberapa rasa yang berbeda:parser push seperti SAX, dan parser tarik. Model pembaca XML:SAX versus XML pull parser memberikan gambaran tentang perbedaannya.

Dorong Parser

Ini adalah contoh singkat menggunakan salsify/json-streaming-parser.

Saat memutar file, kami akan melacak summonerId , championId , dan negara. Semuanya berbasis peristiwa - Anda tidak mendapatkan akses acak dengan pengurai berurutan sehingga Anda harus melacak sendiri. Setiap kali totalSessionsPlayed muncul itu akan menggemakan summonerId , Id Juara , dan totalSessionsPlayed .

data.json

Ini adalah file json yang dipasangkan untuk tujuan demonstrasi.

[
    {
        "_id": "53b29644aafd413977b23b7e",
        "summonerId": 24570940,
        "region": "euw",
        "stats": {
            "110": {
                "totalSessionsPlayed": 3,
                "totalSessionsLost": 2,
                "totalSessionsWon": 1
            },
            "112": {
                "totalSessionsPlayed": 45,
                "totalSessionsLost": 2,
                "totalSessionsWon": 1
            }
        }
    },
    {
        "_id": "asdfasdfasdf",
        "summonerId": 555555,
        "region": "euw",
        "stats": {
            "42": {
                "totalSessionsPlayed": 65,
                "totalSessionsLost": 2,
                "totalSessionsWon": 1
            },
            "88": {
                "totalSessionsPlayed": 99,
                "totalSessionsLost": 2,
                "totalSessionsWon": 1
            }
        }
    }
]

Contoh:

class ListMatchUps extends JsonStreamingParser\Listener\IdleListener
{

    private $key;
    private $summonerId;
    private $championId;
    private $inStats;

    public function start_document()
    {
        $this->key        = null;
        $this->summonerId = null;
        $this->championId = null;
        $this->inStats    = false;
    }

    public function start_object()
    {
        if ($this->key === 'stats') {
            $this->inStats = true;
        } else if ($this->inStats) {
            $this->championId = $this->key;
        }
    }

    public function end_object()
    {
        if ($this->championId !== null) {
            $this->championId = null;
        } else if ($this->inStats) {
            $this->inStats = false;
        } else {
            $this->summonerId = null;
        }
    }

    public function key($key)
    {
        $this->key = $key;
    }

    public function value($value)
    {
        switch ($this->key) {
            case 'summonerId':
                $this->summonerId = $value;
                break;
            case 'totalSessionsPlayed':
                echo "{$this->summonerId},{$this->championId},$value\n";
                break;
        }
    }
}

$stream = fopen('data.json', 'r');
$listener = new ListMatchUps();
try {
    $parser = new JsonStreamingParser_Parser($stream, $listener);
    $parser->parse();
} catch (Exception $e) {
    fclose($stream);
    throw $e;
}

Keluaran:

24570940,110,3
24570940,112,45
555555,42,65
555555,88,99

Tarik Parser

Ini menggunakan parser yang baru-baru ini saya tulis, pcrov/jsonreader (memerlukan PHP 7.)

Data.json sama seperti di atas.

Contoh:

use pcrov\JsonReader\JsonReader;

$reader = new JsonReader();
$reader->open("data.json");

while($reader->read("summonerId")) {
    $summonerId = $reader->value();
    $reader->next("stats");
    foreach($reader->value() as $championId => $stats) {
        echo "$summonerId, $championId, {$stats['totalSessionsPlayed']}\n";
    }
}
$reader->close();

Keluaran:

24570940, 110, 3
24570940, 112, 45
555555, 42, 65
555555, 88, 99



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Memperbarui Kamus di Mongodb

  2. Bagaimana cara memanggil db.Collection.stats() dari driver Java Mongo

  3. Memulai dengan MongoDB dan Mongoose

  4. 3 Cara Mengembalikan Nilai Berbeda di MongoDB

  5. Perbedaan antara count() dan find().count() di MongoDB