根据id获取数据
Posted
技术标签:
【中文标题】根据id获取数据【英文标题】:get data based on id 【发布时间】:2013-01-21 07:53:34 【问题描述】:我正在使用 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
)
)
谢谢
【问题讨论】:
【参考方案1】:此查询非常适合使用 codeigniter 使用条件从集合中获取单个记录
$this->mongo_db->where('_id', $mongoid)->find_one('attributes')
【讨论】:
先生。 Vojtech 请问我的回答有什么错误?【参考方案2】:我不知道 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 不为关系表(mysql,PgSql,...)等某些列提供 AUTO_INCREMENT
选项。相反,它为每个文档提供了一个唯一生成的 id 对象作为主键。
_id
列默认使用与集合本身无关的生成对象的原因是,嗯,因为在内部它是一堆拼接的字节,例如比较原始字节进行排序比解释要快得多比较时它作为字符串字符,不得不乱用字母顺序等,而原始字节可以在逻辑上进行比较,这要快得多。相信我,当您查询超过 100,000,000 个文档时,您会希望它更快,这对于体面大小的 MongoDB 实例来说是很常见的。使用像AUTO_INCREMENT
ed 主键这样的技术也不会轻易允许分片数据库,因为您要确保在插入新文档时每个索引彼此跟随,这肯定会阻止同一集合中的其他插入。这就是使用生成的对象而不是 AUTO_INCREMENT
键的原因。
【讨论】:
【参考方案3】:你可以简单地使用:
$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 驱动程序。
作为参考,这里有一个很好的问题,详细介绍了示例代码 sn-ps 和教程链接:MongoDB and CodeIgniter
【讨论】:
以上是关于根据id获取数据的主要内容,如果未能解决你的问题,请参考以下文章
如何在 laravel 中使用查询生成器根据 id 从多个表中获取数据