正在使用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
)
)
由于
答案 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