mongodb小记

新建用户

先用roo用户进入

mongo 127.0.0.1:27017  -u root -p 123456 --authenticationDatabase admin

创建super用户

use admin

db.createUser({ 
          user: 'super', 
          pwd: 'super', 
          roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] });

db.auth('super','super')

利用super用户新建账号

mongo 127.0.0.1:27017  -u super -p super --authenticationDatabase admin

创建具体项目用户

use bibi
db.createUser({
       user: "bibi",
       pwd: "bibi",
       roles: [ { role: "readWrite", db: "yuyinfang" } ]
      })

db.auth('bibi','bibi')

ttl 索引

应用场景

  • 利用mongo的自己的轮训 自动删除过期的数据,不用自己写脚本删除

表结构

_id value expired_at
主键 过期时间(UTC)

创建索引

db.index_ttl.createIndex( { "expired_at": 1 }, { expireAfterSeconds: 30 } )

mongo写入数据

db.index_ttl.insert( {
   "value" : "xxxx",
   "expired_at": new Date()
} )

php调用mongodb扩展生成ISODate时间

new \MongoDB\BSON\UTCDateTime(new \DateTime(date('Y-m-d H:i:s',time())));

# 以下是format可以不用管,只做个记录

$tz = new \DateTimeZone('PRC');
$time = new \MongoDB\BSON\UTCDateTime(time()*1000);
$date_time = $time->toDateTime()->setTimezone($tz)->format(DATE_ATOM);

坑点

  • expired_at 时间只能是UTC,貌似mongodb统一的UTC时区
  • 时间类型只能是 ISODate 其他一律不行
{
    "_id": ObjectId("5caea0ddfe297260985fd842"),
    "value": NumberInt("1554948317"),
    "expired_at": ISODate("2019-04-11T02:05:17.000Z")
}
  • 删除并不是实时的 mongodb没隔1分钟轮训一次..所以误差会有1分钟
  • 不能实时更改索引的 expireAfterSeconds 只能删除索引,再新建

关于expired_at值的问题

expired_at是你数据要过期的时间戳

类型 ios时间 写入时间 删除时间
小于当前时间 2019-04-09 16:00:00.000 1554949091 1554949126
等于当前时间 2019-04-11 02:20:46.000 1554949247 1554949309
大于当前时间 2019-04-12 16:00:00.000 1554949389 等了5分钟也没删除....

存json和document的效率对比

使用jenssegers/mongodb 打印mongo sql语句

(DB::connection('mongodb'))->enableQueryLog();
# 这里是mongo查询语句
d((DB::connection('mongodb'))->getQueryLog());

monogdb lbs 附近的人

参考文章

php7使用mongodb扩展

出于性能考虑,我可能不会使用jenssegers/mongodb扩展包,而是直接使用mongdb扩展

数据插入:

$manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
$bulk = new MongoDB\Driver\BulkWrite;
$bulk->insert(['name' => 'JetWu5', 'age' => 26]);
$bulk->insert(['name' => 'JetWu6', 'age' => 26]);

$writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
$res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
echo '<pre>';
print_r($res);

数据查询:

$manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
$query = new MongoDB\Driver\Query(['age' => 24], ['sort' => ['age' => 1]]);
$cursor = $manager->executeQuery('wjt.friend', $query);

$data = [];
foreach($cursor as $doc) {
    $data[] = $doc;
}
echo '<pre>';
print_r($data);

数据修改:

$manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
$bulk = new MongoDB\Driver\BulkWrite;
$bulk->update(
    ['name' => 'JetWu5'],
    ['$set' => ['age' => 30, 'promise' => 'always smile!']]
);
$writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
$res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
echo '<pre>';
print_r($res);

数据删除:

$manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
$bulk = new MongoDB\Driver\BulkWrite;
$bulk->delete(['name' => 'JetWu3']);
$bulk->delete(['name' => 'JetWu4']);
$writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);//可选,修改确认
$res = $manager->executeBulkWrite('wjt.friend', $bulk, $writeConcern);
echo '<pre>';
print_r($res);

获得bson_obj_id

$id = new \MongoDB\BSON\ObjectId();

生成自定义的bson_obj_id

$id  = new \MongoDB\BSON\ObjectID('5cbc33e1fe2972061b2aa712')

导入导出

mongodump --authenticationDatabase admin --collection ymxk -h 127.0.0.1 --port 27017 -u root -p 123456 -d yuyinfang -o /tmp

mongorestore --authenticationDatabase admin -h 127.0.0.1 --port 27017 -u root -p 123456 -d yuyinfang /tmp/yuyinfang