Декодирование JSON с помощью PHP из Mongo


Я уже просмотрел этот поток: PHP декодирует вложенный JSON и не смог использовать его для решения своей проблемы.

В настоящее время я получаю объект JSON от Mongo, и у меня возникают проблемы с получением информации из вложенных объектов.

{
"adminLevel" : 200,
    "chat" : true,
    "clans" : [
            BinData(0,"wcXHR577OVBXfy9JwEf5gQAAAAAAAAAAAAAAAAAAAAAAAAAAAA")
    ],
    "experience" : NumberLong(70003),
    "kitNew" : {
            "converted" : true,
            "items" : {
                    "ak47" : {
                            "killCount" : 5,
                            "selected" : false,
                            "unlocked" : 1
                    },
                    "hub-knife" : {
                            "selected" : false
                    },
                    "assault" : {
                            "selected" : false,
                            "unlocked" : 1
                    },
                    "pistol" : {
                            "deathWhileSelectedCount" : 3,
                            "killedBySelectedCount" : 1,
                            "killWhileSelectedCount" : 1,
                            "selected" : false,
                            "unlocked" : 1
                    },

                    "m1014" : {
                            "deathWhileSelectedCount" : 3,
                            "killedBySelectedCount" : 1,
                            "killCount" : 17,
                            "killWhileSelectedCount" : 1,
                            "killedByCount" : 1,
                            "selected" : false,
                            "unlocked" : 1
                    },
            },
    },
    "points" : NumberLong(87167),
}

Моя цель здесь - распечатать информацию о каждом из элементов, мой PHP-код выглядит следующим образом

// execute query
// retrieve all documents
$query = array("lastKnownUsername"  => "Strubo");
$cursor = $collection->find($query);
$array = json_decode($cursor, true);
$items = $array->kitNew->items;

foreach($items as $item){
    echo "<tr>";
        echo "<td>" . $item . "</td>";
        echo "<td>" . $item->killCount . "</td>";
    echo "<td>" . $item->killedByCount . "</td>";
        echo "<td>" . $item->selected . "</td>";
    echo "<td>" . $item->unlocked . "</td>";
    echo "</tr>";
}

// disconnect from server
$conn->close();
} catch (MongoConnectionException $e) {
        die('Error connecting to MongoDB server');
} catch (MongoException $e) {
    die('Error: ' . $e->getMessage());
}

Я знаю, что нет проблем с подключением к базе данных или каких-либо проблем с окружающей средой, как и другие проявления захватил работу с данными. Проблема здесь просто в вложенности.

Спасибо.

Author: Community, 2014-04-11

1 answers

MongoDB не хранит данные в формате JSON.

Вставленный вами документ, похоже, скопирован и вставлен из оболочки. Это также не формат JSON. Этот формат называется расширенным JSON - и именно так оболочка MongoDB представляет данные в javascript. Большинство примеров на веб-сайте MongoDB также используют этот формат, поскольку он прост и удобен. Поэтому вместо того, чтобы иметь десятки различных форматов вывода (для каждого языкового драйвера), официальные документы MongoDB используют оболочку для демонстрация функциональности и результатов.

Фактический формат подложки называется двоичным JSON (BSON). Вы никогда не увидите этот формат и никогда не будете взаимодействовать с ним.

Когда вы взаимодействуете с MongoDB на PHP, все, что вам нужно знать, это то, что вы сохраняете массив PHP. Данные, возвращаемые из MongoDB, также являются массивом PHP. Формат подложки диска не имеет значения.

Вам никогда не придется вызывать json_encode() или json_decode().

Метод $collection->find($query) возвращает объект, называемый МонгоКурсор. Вы должны выполнить итерацию по этому объекту, чтобы получить результаты, которые будут представлять собой массив PHP.

foreach($collection->find($query) as $result) {
    var_dump($result);
}

В этом примере кода будет выполняться функция var_dump() по одному результату за раз. Это result называется "Документом MongoDB" и похоже на "строку MySQL". Как и в случае с MySQL, вам не нужно знать, что такое протокол подложки или какой формат подложки диска - это не влияет на вас.

Я настоятельно рекомендую вам прочитать учебник по PHP-драйверу MongoDB: http://us2.php.net/manual/en/mongo.tutorial.php

Это должно немного лучше объяснить концепцию, а также то, как работает драйвер:)

 7
Author: bjori, 2014-04-10 23:12:53