MongoDB将ObjectId转换为结果中的字符串

时间:2013-04-14 19:46:16

标签: php mongodb

如果文档的值为MongoId对象的字段,它将返回到像http://dl.dropbox.com/u/7017985/Screenshots/26.jpg这样的PHP,有没有办法像简单字符串那样返回它而不是MongoId对象

为什么需要它?因为我需要将结果发送到javascript浏览器端。我的文档有2-3个字段,它们是另一个文档的引用,它们保持为ObjectId

4 个答案:

答案 0 :(得分:0)

MongoID支持__toString。如果将其强制转换为字符串,或直接调用__toString,则会将该值转换为字符串。

答案 1 :(得分:0)

我不相信有。

MongoDB以BSON文档的形式获取输入和输出,其ObjectId字段采用此特定格式。

这是你无法改变的。

答案 2 :(得分:0)

您可以遍历查询结果并将所有MongoId对象转换为字符串。如果从MongoCollection :: findOne()获得单个结果数组,或者从MongoCollection :: find()获得MongoCursor结果,则下面的函数将转换所有id。

function convert_mongoid_to_string(& $mongo_object)
{
    foreach($mongo_object as $mongo_key=>$mongo_element)
    {
        if(is_array($mongo_element)||is_object($mongo_element))
        {
            if(get_class($mongo_element) === "MongoId")
            {
                 //cast the object to the original object passed by reference
                 $mongo_object[$mongo_key]=(string)$mongo_element;
            }
            else
            {
                //recursively dig deeper into object looking for MongoId's
                convert_mongoid_to_string($mongo_element);
            }
        }
        else
        {
            //is scalar so just continue
            continue;
        }
    }
    return $mongo_object;
}

答案 3 :(得分:0)

我需要MongoIds是javascript / json(客户端)友好所以我想透明地转换多个mongoIds。我找不到任何内置功能来实现这一目标,但提出了以下解决方案:

<?php
function strToMongoIdObj(Array $_ids) {
    return array_map(function($id) {
            return new MongoId($id);
        }, $_ids);
}

function mongoIdToStr(MongoCursor $cursor) {
    $rs = array();
    foreach ($cursor as $doc) {
        $doc['_id'] = (string)$doc['_id'];
        $rs[] = $doc;
    }
    return $rs;
}

$_ids = array("522dbdd29076fde9057bb5ed",
              "522dbf229076fdeb053f5b7b");

$m = new MongoClient();
$cursor = $m->db->col
    ->find(array('_id' => array('$in' => strToMongoIdObj($_ids))));

print_r(mongoIdToStr($cursor));