0

我正在使用 codeigniter 和 mongodb 开发一个项目。如何根据 _id 从 mongodb 获取数据。我的意思是如何在 '$query=$this->mongo_db->get_where('photos', $where 中给出 where 条件)'。我需要根据'id'获取photos_path。请帮忙

这是我的 mongodb 集合的数组格式:-

    Array
(
    [0] => Array
    (
        [_id] => MongoId Object
            (
                [$id] => 510f7e0d2217f4fc03000000
            )

        [key] => organization_img
        [photos_path] => uploads/img_51359969805.gif
    )

[1] => Array
    (
        [_id] => MongoId Object
            (
                [$id] => 5111ef2f2217f4280a000000
            )

        [key] => organization_img
        [photos_path] => uploads/image.png
    )

)

谢谢

4

3 回答 3

2

此查询非常适合使用条件从带有 codeigniter 的集合中获取单个记录

$this->mongo_db->where('_id', $mongoid)->find_one('attributes')
于 2016-11-09T07:44:01.013 回答
1

我不知道 CodeIgniter 的 MongoDB API 与驱动程序的 API 有何不同,但您必须实例化一个新实例MongoId并将其传递给查询,如下所示:

$m = new MongoClient(...);
$col = $m->selectCollection(...);

$cursor = $col->findOne(array('_id' => new \MongoId($id)));

这是由于 MongoDB 如何保存其 _id 列。http://docs.mongodb.org/manual/core/object-id/

如果您在创建新文档时提供一个简单的字符串作为 _id 列,则不必在MongoId每次查询时都实例化一个新对象。请记住,如果您这样做,您必须自己关心唯一身份和基数,因为 MongoDB 不AUTO_INCREMENT为某些列提供选项,如关系表(MySql,PgSql,...)。相反,它为每个文档提供一个唯一生成的 id 对象作为主键。

_id列默认使用与集合本身无关的生成对象的原因是,嗯,因为在内部它是一堆拼接字节,例如比较原始字节进行排序比在比较时将其解释为字符串字符要快得多,不得不乱用字母顺序等,而原始字节可以在逻辑上进行比较,这要快得多。相信我,当您查询超过 100,000,000 个文档时,您会希望它更快,这对于体面大小的 MongoDB 实例来说是很常见的。使用类似的技术AUTO_INCREMENTed 主键也不会轻易允许分片数据库,因为您要确保在插入新文档时每个索引彼此跟随,这肯定会阻止同一集合中的其他插入。这就是为什么使用生成的对象而不是AUTO_INCREMENT键的原因。

于 2013-02-06T08:11:24.987 回答
0

您可以简单地使用:

$query=$this->mongo_db->get_where('photos', 
    array('_id' => new \MongoId($_id_of_another_row))
)

如果$_id_of_another_row已经是 MongoId ( if($_id_of_another_row instanceof \MongoId)) 那么您不需要再次包装它并且可以立即使用它。

将其包装MongoId在 MongoDB 本身中将为查询文档创建以下代表性结构(基本上是上面的代码):

[_id] => MongoId Object(
    [$id] => 5111ef2f2217f4280a000000
)

我必须承认我从未使用过 CI,但他们的 API 似乎只是扩展了 MongoDB 自己的 PHP 驱动程序。

作为参考,这里有一个很好的问题,详细介绍了示例代码片段和教程链接:MongoDB 和 CodeIgniter

于 2013-02-06T09:26:47.393 回答