MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Jak prawidłowo iterować przez duży plik json

Będziesz chciał użyć parsera strumieniowego. Pobierają one do pamięci tylko małe fragmenty pliku na raz.

Występują w kilku różnych wersjach:parsery push przypominające SAX i parsery pull. Modele czytników XML:analizator ściągania SAX i XML zawiera przegląd różnic.

Push Parser

To jest szybki przykład użycia salsify/json-streaming-parser.

Podczas przewijania pliku będziemy śledzić summonerId , championId i stan. Wszystko opiera się na zdarzeniach — nie otrzymujesz losowego dostępu za pomocą sekwencyjnego parsera, więc musisz sam śledzić rzeczy. Za każdym razem, gdy totalSessionsPlayed pojawi się, wyświetli summonerId , Identyfikator mistrza i całkowita liczba rozegranych sesji .

data.json

To jest sparowany plik json do celów demonstracyjnych.

[
    {
        "_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
            }
        }
    }
]

Przykład:

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

Wyjście:

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

Wyciągnij analizator

To używa parsera, który niedawno napisałem, pcrov/jsonreader (wymaga PHP 7.)

Ten sam data.json jak powyżej.

Przykład:

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

Wyjście:

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. MongoDB/NoSQL:przechowywanie historii zmian dokumentów

  2. Meteor, relacja jeden do wielu i dodać pole tylko do kolekcji po stronie klienta w Publish?

  3. Jak wysłać zapytanie do MongoDB, aby sprawdzić, czy element istnieje?

  4. używanie $i $match w mongodb

  5. Przekieruj wyjście zapytania mongo do pliku csv