根据id获取数据

时间:2013-02-06 07:18:35

标签: codeigniter mongodb

正在使用codeigniter和mongodb处理项目。如何基于_id从mongodb获取数据。我的意思是我如何在'$ query = $ this-> mongo_db-> get_where('中给出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
    )

由于

3 个答案:

答案 0 :(得分:1)

我不知道CodeIgniter的MongoDB 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没有为关系表(MySql,PgSql,...)之类的某些列提供AUTO_INCREMENT的选项。 。相反,它为每个文档提供唯一生成的id对象作为主键。

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

答案 1 :(得分:1)

此查询非常适合使用条件

从codeigniter获取单个记录
$this->mongo_db->where('_id', $mongoid)->find_one('attributes')

答案 2 :(得分: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 and CodeIgniter