一般mysql中建表的时候,可以设置主键id自增,如下
id BIGINT(20) PRIMARY KEY NOT NULL AUTO_INCREMENT,
而现在我用的mongodb,想通过pymongo库同样实现一个每插入一条记录,自身id就根据表中最后一条记录自增,如何实现?我目前只有每次插入的时候查询一次表的长度,然后+1实现,这样不太靠谱,因为多线程使用的时候会出现id重复,有其它办法实现吗?
一般mysql中建表的时候,可以设置主键id自增,如下
id BIGINT(20) PRIMARY KEY NOT NULL AUTO_INCREMENT,
而现在我用的mongodb,想通过pymongo库同样实现一个每插入一条记录,自身id就根据表中最后一条记录自增,如何实现?我目前只有每次插入的时候查询一次表的长度,然后+1实现,这样不太靠谱,因为多线程使用的时候会出现id重复,有其它办法实现吗?
原味文档可以先阅读一下,解释了具体做法。
这个问题很多人问,但实际上并不推荐。我在这个问题里面解释了为什么:
mongoDB修改"_id"的objectID到普通递增id为什么不好
public static function getId($collection)
{
list($db, $collection) = explode('.', $collection);
$command = new Command(array(
'findandmodify' => 'ids', 'update' => ['$inc' => ['id' => 1]],
'query' => ['collection' => $collection], 'new' => true, 'upsert' => true
));
$cursor = self::getManager()->executeCommand($db, $command);
$cursor->setTypeMap(['root' => 'array']);
return $cursor->toArray()[0]['value']->id;
}
4 回答4.4k 阅读✓ 已解决
4 回答3.8k 阅读✓ 已解决
1 回答3k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
1 回答4.5k 阅读✓ 已解决
1 回答3.8k 阅读✓ 已解决
1 回答2.8k 阅读✓ 已解决
谢谢各位的解答,我这边情况比较特殊,因为服务器上还部署了redis数据库,所以我实现自增是在redis中自增id获得的值作为mongodb的自增id,redis的incr操作可以实现返回自增id的值,即使多线程,高并发,也不会出现id重复的情况。redis的incr是可以同时自增并返回增长后的值的,这样可以弥补mongodb的自增困境。