MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Как правилно да повторите през голям json файл

Ще искате да използвате поточно анализатор. Те изтеглят само малки части от вашия файл в паметта наведнъж.

Те се предлагат в няколко различни варианта:SAX-подобни push парсери и изтеглящи анализатори. Модели на XML четец:SAX срещу XML изтеглящ анализатор дава общ преглед на разликата.

Push Parser

Това е бърз пример за използване на salsify/json-streaming-parser.

Докато се движи през файла, ние ще следим summonerId , championId , и състояние. Всичко е базирано на събития - не получавате произволен достъп с последователен анализатор, така че трябва сами да следите нещата. Всеки път, когато totalSessionsPlayed се появява и ще изведе summonerId , championId и totalSessionsPlayed .

data.json

Това е сдвоен json файл за демонстрационни цели.

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

Пример:

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

Изход:

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

Изтеглете парсер

Това използва анализатор, който наскоро написах, pcrov/jsonreader (изисква PHP 7.)

Същите data.json като по-горе.

Пример:

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

Изход:

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 2.1 Aggregate Framework Сума от елементи на масив, съответстващи на име

  2. Съвкупността на MongoDB попълва липсващите дни

  3. Преведете FilterDefinition<TDocument> към обикновена json mongo заявка, която мога да изпълнявам в mongo shell

  4. Единици, които да използвате за maxdistance и MongoDB?

  5. Как да накарам Spring-Data-MongoDB да валидира моите обекти?