使用Mongo中的PHP解码JSON

Str*_*ugh 3 php json mongodb mongodb-php

我已经看过这个帖子:PHP解码嵌套的JSON并且没有设法用它来解决我的问题.

我目前正在从Mongo抓取一个JSON对象,我遇到了从嵌套对象中获取信息的问题.

{
"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),
}
Run Code Online (Sandbox Code Playgroud)

我的目标是打印出有关每个项目的信息,我的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());
}
Run Code Online (Sandbox Code Playgroud)

我知道连接到数据库或任何环境问题没有问题,因为其他显示的抓取数据工作.它只是嵌套这是问题所在.

谢谢.

bjo*_*ori 7

MongoDB的确实不是数据存储为JSON.

您粘贴的文档似乎是从shell复制和粘贴的.这也不是JSON格式.这种格式称为扩展JSON - 是MongoDB shell如何在javascript中表示数据.MongoDB网站上的大多数示例也使用此格式,因为它简单易用.因此,而不是有几十种不同的输出格式(对于每种语言驱动程序),MongoDB官方文档使用shell来演示功能和输出.

实际的底层格式称为二进制JSON(BSON).你永远不会看到这种格式,你永远不会与它互动.

当您使用PHP与MongoDB交互时,您必须知道的是保存PHP数组.从MongoDB返回的数据也是一个PHP数组.底层磁盘格式不相关.

你永远不必调用json_encode()或json_decode().

该$collection->find($query)方法返回一个名为MongoCursor的对象.您应该遍历此对象以获取结果,这将是一个PHP数组.

foreach($collection->find($query) as $result) {
    var_dump($result);
}
Run Code Online (Sandbox Code Playgroud)

这个代码示例将var_dump()一次一个结果.这result称为"MongoDB文档",类似于"MySQL行".就像MySQL一样,您不必知道底层协议是什么,或底层磁盘格式是什么 - 这对您没有任何影响.

我强烈建议您阅读MongoDB PHP驱动程序教程:http://us2.php.net/manual/en/mongo.tutorial.php

这应该更好地解释这个概念,以及驱动程序如何工作:)