首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MongoDB (php) -将文档属性作为数组而不是多个属性返回

MongoDB (php) -将文档属性作为数组而不是多个属性返回
EN

Stack Overflow用户
提问于 2016-05-17 18:05:33
回答 5查看 7.5K关注 0票数 2

我正在从mongodb数据库读取一个文档,并将它与php一起传递给客户端。

文档包含一个数组属性。问题是,客户端将其作为一个具有名称为01等属性的对象来接收,而不是标准数组。

这是原始数据:

代码语言:javascript
复制
{ 
    "_id" : ObjectId("573b47a1f99a8a1f9a6278a5"), 
    "persons" : [
        {
            "name" : "Moshe",
        }, 
        {
            "name" : "E",
        }, ...
    ]
}

根据请求,我将附加var_export:

代码语言:javascript
复制
array (
  0 => 
  MongoDB\Model\BSONDocument::__set_state(array(
     '_id' => 
    MongoDB\BSON\ObjectID::__set_state(array(
    )),
     'persons' => 
    MongoDB\Model\BSONArray::__set_state(array(
       0 => 
      MongoDB\Model\BSONDocument::__set_state(array(
         'name' => 'Moshe',
      )),
       1 => 
      MongoDB\Model\BSONDocument::__set_state(array(
         'name' => 'E',
      )),
    )),
  )),
)

和var_dump:

代码语言:javascript
复制
array(1) {
  [0]=>
  object(MongoDB\Model\BSONDocument)#40 (1) {
    ["storage":"ArrayObject":private]=>
    array(2) {
      ["_id"]=>
      object(MongoDB\BSON\ObjectID)#11 (1) {
        ["oid"]=>
        string(24) "573b47a1f99a8d1f986278a5"
      }
      ["persons"]=>
      object(MongoDB\Model\BSONArray)#34 (1) {
        ["storage":"ArrayObject":private]=>
        array(2) {
          [0]=>
          object(MongoDB\Model\BSONDocument)#10 (1) {
            ["storage":"ArrayObject":private]=>
            array(1) {
              ["name"]=>
              string(5) "Moshe"
            }
          }
          [1]=>
          object(MongoDB\Model\BSONDocument)#12 (1) {
            ["storage":"ArrayObject":private]=>
            array(1) {
              ["name"]=>
              string(1) "E"
            }
          }
        }
      }
    }
  }
}

这是PHP代码(全部):

代码语言:javascript
复制
function select(){
    $conn = new MongoDB\Client("mongodb://localhost:27017");
    $db = $conn->mydb;
    $cursor = $db->entries_meta_data->find();
    return current($cursor->toArray());
}

然后,我用这样的json_encode将对象传递给客户端:

代码语言:javascript
复制
echo json_encode(select());

在客户端出现的结果是:

代码语言:javascript
复制
{ 
    "_id" : ObjectId("573b47a1f99a8a1f9a6278a5"), 
    "persons" : {
        "0" : {
            "name" : "Moshe",
        }, 
        "1" : {
            "name" : "E",
        }, ...
    }
}

编辑: LordNeo实际上解决了这个问题。在阅读了他的答案后,我将我的"select“函数的最后一行更改为:

代码语言:javascript
复制
return json_decode(json_encode(current($cursor->toArray()),true);

看上去很可怕,但很管用。

我将非常乐意听到更好的解决办法。

EN

Stack Overflow用户

发布于 2016-08-28 00:15:26

MongoDB驱动程序提供一个MongoDB\BSON\toJSON()函数,该函数正确地将数据转换为JSON。因为它需要一个字符串作为输入,所以首先需要调用文档上的MongoDB\BSON\fromPHP()。由于您只想获得第一个查找元素,所以可以使用findOne()方法而不是find(),这使得获得输出非常容易:

代码语言:javascript
复制
function select() {
  $conn = new MongoDB\Client("mongodb://localhost:27017");
  $db = $conn->mydb;
  $doc = $db->entries_meta_data->findOne();
  return MongoDB\BSON\toJSON(MongoDB\BSON\fromPHP($doc));
}

如果您想要输出多个条目,它会变得更加复杂。输出数组的一种方法(无可否认是恶意的)如下所示:

代码语言:javascript
复制
function select() {
  $conn = new MongoDB\Client("mongodb://localhost:27017");
  $db = $conn->mydb;
  $cursor = $db->entries_meta_data->find();
  $result = $cursor->toArray();
  foreach($result as $i => $doc) {
    $result[$i] = MongoDB\BSON\toJSON(MongoDB\BSON\fromPHP($doc));
  }
  return '[' . implode($res) . ']';
}

另一种方法是在BSONArray类被json_encode()调用时调整其输出。为此,您需要调整当BSONArray.php位于‘设置MongoDB驱动程序 /mongodb/mongodb/src/Model’文件夹中时得到的JsonSerializable文件,并添加JsonSerializable接口和jsonSerialize()方法,使其如下所示:

代码语言:javascript
复制
<?php

...

class BSONArray extends ArrayObject implements \JsonSerializable,
    Serializable, Unserializable
{
    ...

    /**
     * Serialize the ArrayObject as normal array
     *
     * @return array
     */  
    public function jsonSerialize() {
        return $this->getArrayCopy();
    }
}
票数 3
EN
查看全部 5 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37283350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档