php7下原生实现mongodb主键自增

背景与问题

mongodb采用了一个称之为ObjectId的类型来做主键。ObjectId是一个12字节的 BSON 类型字符串.按照字节顺序,依次代表:
4字节:UNIX时间戳;
3字节:表示运行MongoDB的机器;
2字节:表示生成此_id的进程;
3字节:由一个随机数开始的计数器生成的值;
但在某些情况下,我们可能需要id字段具备自增的功能。由于 MongoDB 没有实现这个功能,我们需要额外编写代码来实现该功能。

解决思路

额外表的表结构
我们可以新建一张表,然后这张表有两个字段collectionName和value,collectionName表示表的名称,value表示该表当前的最大主键值,因此在每次插入数据时我们只需要获取value+1便是新的主键值了,同时不要忘了更新value字段的值

实现代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php

namespace Admin\Util;
use MongoDB\Driver\Manager;
use MongoDB\Driver\BulkWrite;
use MongoDB\Driver\Query;
use MongoDB\Driver\WriteConcern;
class MongoIncrementId{
public static $mongo = null;
static public function getIncrementId($collection){
if (self::$mongo == null)
self::$mongo = new Manager("mongodb://localhost:27017/test");
$bulk = new BulkWrite;
$query = new Query(['collectionName' => $collection]);
$cursor = self::$mongo->executeQuery('test.IncrementId', $query);
$cursor = $cursor->toArray();
if (count($cursor) == 0){
$bulk->insert([
'collectionName' => $collection,
'value' => 1
]
);
}else{
$bulk->update(
['collectionName' => $collection],
['$set' => ['value' => $cursor[0]->value + 1]],
['multi' => false, 'upsert' => false]
);
}
$writeConcern = new WriteConcern(WriteConcern::MAJORITY, 1000);
self::$mongo->executeBulkWrite('test.IncrementId',$bulk,$writeConcern);
$cursor = self::$mongo->executeQuery('test.IncrementId', $query);
$cursor = $cursor->toArray();
return $cursor[0]->value;
}

}
-------------本文结束您的阅读与肯定是我持续装*的最大动力-------------